Trabalhar com aliases de coluna reutilizáveis
O GoogleSQL no BigQuery oferece suporte a aliases de coluna reutilizáveis. Um alias de coluna reutilizável permite definir um alias para uma expressão na cláusula SELECT de uma consulta SQL e referenciar esse alias imediatamente na mesma lista SELECT ou na cláusula WHERE do mesmo bloco de consulta.
Por exemplo, a consulta a seguir mostra como filtrar resultados com base em um cálculo, como gross_price. É possível referenciar o alias gross_price diretamente na cláusula WHERE em vez de repetir o cálculo na cláusula WHERE ou usar uma subconsulta:
SELECT
net_price * 1.23 as gross_price
FROM
product
WHERE
gross_price < 10.0
Os aliases de coluna reutilizáveis oferecem:
- Sintaxe SQL simplificada: é possível escrever cálculos limpos, concisos e da esquerda para a direita sem repetir expressões complexas ou envolver consultas em subconsultas.
- Melhor legibilidade: analistas e desenvolvedores podem declarar uma expressão uma vez e reutilizá-la imediatamente. Isso facilita a leitura, a depuração e a manutenção das consultas.
Ativar ou desativar aliases de coluna reutilizáveis
Por padrão, os aliases de coluna reutilizáveis estão desativados. Para usar aliases de coluna, o administrador do BigQuery precisa ativar o recurso definindo a opção reusable_column_aliases_mode como on usando uma das seguintes instruções da linguagem de definição de dados (DDL):
Para ativar aliases de coluna no nível da organização, use a instrução ALTER ORGANIZATION SET OPTIONS.
Para ativar aliases de coluna no nível do projeto, use a instrução ALTER PROJECT SET OPTIONS.
Para definir essa opção de configuração, você precisa do papel de administrador do BigQuery (roles/bigquery.admin) ou da permissão bigquery.projects.update no projeto ou bigquery.organizations.update na organização.
Para informações sobre as permissões necessárias para definir opções de configuração, consulte
Permissões necessárias
na página Gerenciar configurações.
Para desativar aliases de coluna reutilizáveis, defina reusable_column_aliases_mode como off.
Se você definir o valor como NULL, o padrão do sistema será usado e o recurso também será desativado.
Exemplos
Para ativar aliases de coluna reutilizáveis no nível da organização, insira a seguinte instrução DDL:
ALTER ORGANIZATION
SET OPTIONS (
`region-<code><var>REGION</var></code>.reusable_column_aliases_mode` = "on"
);
Substitua REGION pela sua região.
Para ativar aliases de coluna reutilizáveis no nível do projeto, insira a seguinte instrução DDL:
ALTER PROJECT <code><var>PROJECT_ID</var></code>
SET OPTIONS (
`region-<code><var>REGION</var></code>.reusable_column_aliases_mode` = "on"
);
Substitua:
- REGION: sua região.
- PROJECT_ID: o ID do projeto.
Verificar se os aliases de coluna estão ativados ou desativados
É possível verificar se os aliases de coluna reutilizáveis estão ativados ou desativados no nível do projeto ou da organização consultando as seguintes visualizações do esquema de informações:
Para mais informações sobre como trabalhar com visualizações do esquema de informações, consulte Introdução
a INFORMATION_SCHEMA.
Como usar aliases de coluna reutilizáveis
É possível usar um alias, um identificador atribuído a uma expressão, em uma cláusula WHERE ou SELECT:
- Cláusula
WHERE: filtragem com base em uma coluna calculada definida na lista SELECT. - Cláusula
SELECT: usar um alias calculado para definir outro alias na mesma lista de projeção ou para determinar quais dados são retornados pela consulta.
Exemplo
Este exemplo mostra como usar aliases de coluna reutilizáveis para calcular um valor com base em outro cálculo definido anteriormente na lista SELECT. A consulta também mostra como se referir ao alias na cláusula WHERE:
SELECT
net_price * 1.23 as gross_price,
gross_price * 0.5 as discounted_gross_price
FROM
product
WHERE
discounted_gross_price < 10.0;
Mudanças de comportamento (desvio semântico) na ordem de resolução de nomes de consulta
Um nome de identificador pode existir como uma coluna física na tabela e como um alias criado. Portanto, considere a ordem de resolução de nomes da consulta. O BigQuery resolve nomes na seguinte ordem:
- Nome da coluna: as colunas atuais na tabela sempre têm a maior prioridade.
- Alias: o alias definido na consulta.
- Coluna de consulta externa: colunas de uma consulta mãe.
- Argumento de função: se estiver em execução em uma função definida pelo usuário (UDF) ou uma função com valor de tabela (TVF).
- Variáveis de script: variáveis definidas em um script.
Com base nessa ordem, se a tabela tiver uma coluna chamada gross_price e você criar um alias chamado gross_price, a consulta usará o valor da coluna, não o alias.
Isso significa que, se você tiver uma coluna de consulta externa, um argumento de função ou uma variável de script com o mesmo nome de um alias definido na cláusula SELECT, o BigQuery usará o valor do alias para cálculos em vez da variável ou do argumento.
Exemplos de como a ordem de resolução de nomes funciona
Os exemplos a seguir mostram como a ordem de resolução de nomes funciona com aliases de coluna reutilizáveis quando há conflitos de nomenclatura.
Conflito com uma coluna de consulta externa
Se você não ativar aliases de coluna reutilizáveis, um alias definido na cláusula SELECT que tenha o mesmo nome de uma coluna nos resultados da consulta externa fará com que a coluna de consulta externa seja usada. Com aliases de coluna reutilizáveis ativados, o alias "sombra" a coluna de consulta externa no escopo da consulta.
No exemplo a seguir, uma consulta aninhada usa aliases e tem acesso às colunas da consulta externa:
SELECT
name,
net_price,
category_id, -- table product has category_id column
(SELECT 100 AS category_id -- alias defined with the same name
FROM category c
WHERE
id = category_id -- Now the alias category_id is used here, not the outer query column
) as X
FROM
product;
Se você não ativar aliases de coluna reutilizáveis, a subconsulta usará a coluna category_id da tabela product na consulta externa. Como resultado, o valor category_id varia por linha. Se você ativar aliases de coluna reutilizáveis, a consulta usará o valor do alias 100 para todas as linhas.
Conflito com argumentos de função
Se uma consulta estiver em execução dentro de uma função definida pelo usuário (UDF), um alias definido nessa consulta terá precedência sobre os argumentos da função.
No exemplo a seguir, a função calculate_metric tem um argumento de entrada chamado val:
CREATE TEMP FUNCTION calculate_metric(val INT64) AS ((
SELECT AS STRUCT
5 AS val, -- Alias defined as constant 5
val + 10 -- Reference to 'val'
));
-- Calling the function with argument 100
SELECT calculate_metric(100);
Se você não ativar aliases de coluna reutilizáveis, a consulta usará o valor do argumento
transmitido para a função (100) e o resultado será calculado como 110 (100 +
10). Se você ativar aliases de coluna reutilizáveis, a consulta usará o alias definido em
a lista SELECT (5) e o resultado será calculado como 15 (5 + 10).
Conflito com variáveis de script
Se você não ativar aliases de coluna reutilizáveis e tiver um alias definido na cláusula SELECT que tenha o mesmo nome de uma variável de script, a variável de script será usada. Se você ativar aliases de coluna reutilizáveis, o alias vai sombrear a variável no escopo da consulta.
O exemplo a seguir declara uma variável chamada gross_price que tem um valor padrão de 10.0. A consulta também calcula uma coluna e a define como gross_price:
DECLARE gross_price NUMERIC DEFAULT 10.0;
SELECT
net_price * 1.23 AS gross_price,
-- Usage of 'gross_price' here determines the behavior
gross_price * 0.5 AS discounted_gross_price
FROM
product;
Se você não ativar aliases de coluna reutilizáveis, a consulta usará o valor da variável de 10.0. O resultado é um valor discounted_gross_price de 5.0, que é uma constante para todas as linhas. O resultado é calculado como 10.0 * 0.5 = 5.0.
Se você ativar aliases de coluna reutilizáveis, a consulta usará o valor do alias de net_price * 1.23. O resultado é um valor discounted_gross_price que varia por linha. O resultado é calculado como (net_price * 1.23) * 0.5.
Práticas recomendadas
Ao usar aliases de coluna reutilizáveis, considere as seguintes práticas recomendadas:
- Antes de ativar os aliases de coluna reutilizáveis, avalie o impacto deles nas cargas de trabalho atuais.
- Para evitar comportamentos indesejados ou mudanças de comportamento silenciosas (desvio semântico), não use o nome das variáveis de script, argumentos de função ou colunas em consultas externas como o nome do alias.
- Se você estiver migrando SQL de um dialeto de origem que oferece suporte à semântica de alias , como Teradata ou Snowflake, siga as instruções de tradução de SQL antes de iniciar a migração.
Solução de problemas de aliases de coluna
Os exemplos a seguir mostram como solucionar problemas comuns com aliases de coluna reutilizáveis.
Problema: você recebe resultados de consulta inesperados ou o alias parece ser ignorado.
Resolução: verifique a ordem de resolução de nomes. Se a tabela contiver uma coluna com o mesmo nome do alias, o nome da coluna terá maior prioridade do que o alias. Atribua um nome exclusivo ao alias para evitar esse conflito.
Erro: Column not found.
Resolução: verifique se você não está usando uma referência direta. Só é possível referenciar um alias que foi definido antes do uso. Isso é avaliado da esquerda para a direita.
Erro: Column name is ambiguous.
Resolução: verifique se o nome do alias não está definido mais de uma vez na mesma
SELECT lista antes de ser referenciado.
Limitações
Os aliases de coluna reutilizáveis estão sujeitos às seguintes limitações:
Quando uma consulta inclui agrupamento ou agregação, aliases para expressões não agregadas (colunas de agrupamento ou projeções de colunas de agrupamento) não são permitidos na cláusula
WHEREou como argumentos para funções agregadas. Na consulta a seguir, o aliasbse refere incorretamente a uma expressão que incluia, que é uma coluna de agrupamento:SELECT a+1 as b, sum(b) -- sum(b) is invalid. FROM t WHERE b > 5 -- Referencing b under WHERE clause is not allowed. GROUP BY aAliases que referenciam uma função agregada ou de janela direta ou transitivamente não podem ser usados na cláusula
WHEREou como argumentos para outras funções agregadas. Na consulta a seguir, o aliasxse refere incorretamente a uma função agregada:SELECT sum(a) AS x, sum(x) -- sum(x) is invalid. FROM t WHERE x > 0 -- Referencing x under WHERE clause is not allowed.Não é permitido aplicar uma função de janela a um alias que se refere a outra função de janela direta ou transitivamente. Na consulta a seguir, o alias
xse refere a uma função de janela inválida:SELECT count(*) over() AS x, sum(x) over() -- sum(x) over() is invalid. FROM tAliases de coluna reutilizáveis não são compatíveis com a sintaxe de pipe.
Aliases de coluna reutilizáveis não são compatíveis com a linguagem GraphQL (GQL).