Trabalhar com aliases de coluna reutilizáveis
O GoogleSQL no BigQuery é compatível com aliases de coluna reutilizáveis. Com um alias de coluna reutilizável, é possível definir um alias para uma expressão na
cláusula SELECT de uma consulta SQL e referenciar imediatamente esse alias 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 encapsular 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 os 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, é necessário ter o papel de Administrador do BigQuery (roles/bigquery.admin) ou a 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 as opções de configuração, consulte
Permissões necessárias
na página "Gerenciar configurações".
Para desativar os 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 os aliases de coluna reutilizáveis no nível da organização, insira a seguinte instrução DDL:
ALTER ORGANIZATION
SET OPTIONS (
`region-REGION.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 PROJECTPROJECT_IDSET OPTIONS ( `region-REGION.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
Para verificar se os aliases de coluna reutilizáveis estão ativados ou desativados no nível do projeto ou da organização, consulte as seguintes visualizações do esquema de informações:
Para mais informações sobre como trabalhar com visualizações de 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 comportamentais (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 que você cria. 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 prioridade mais alta.
- 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 em 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 vai 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 funciona a ordem de resolução de nomes
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 os aliases de coluna reutilizáveis, um alias definido na cláusula SELECT
com o mesmo nome de uma coluna na consulta externa vai resultar no uso da
coluna da consulta externa. Com os aliases de coluna reutilizáveis ativados, o alias
"oculta" a coluna da 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 os aliases de coluna reutilizáveis, a subconsulta vai usar a coluna category_id
da tabela product na consulta externa. Como resultado, o valor de category_id varia de acordo com a linha. Se você ativar os aliases de coluna reutilizáveis, a
consulta vai usar o valor de alias de 100 para todas as linhas.
Conflito com argumentos de função
Se uma consulta estiver sendo executada dentro de uma função definida pelo usuário (UDF, na sigla em inglês), 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 os aliases de coluna reutilizáveis, a consulta vai usar o valor do argumento
transmitido para a função (100), e o resultado será calculado como 110 (100 +
10). Se você ativar os aliases de coluna reutilizáveis, a consulta vai usar o alias definido na
lista SELECT (5), e o resultado será calculado como 15 (5 + 10).
Conflito com variáveis de script
Se você não ativar os aliases de coluna reutilizáveis e tiver um alias definido na
cláusula SELECT com 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 ocultar 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 os aliases de coluna reutilizáveis, a consulta vai 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 os aliases de coluna reutilizáveis, a consulta vai usar o valor de 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 suas cargas de trabalho atuais.
- Para evitar comportamentos não intencionais ou mudanças silenciosas de comportamento (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 compatível com 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 resolver 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 tiver uma coluna com o mesmo nome do alias, o nome da coluna terá prioridade mais alta do que o alias. Dê 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 fazer referência a 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 lista SELECT 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 aOs aliases que fazem referência a uma função de agregação ou de janela de maneira direta ou transitiva não podem ser usados na cláusula
WHEREou como argumentos para outras funções de agregação. Na consulta a seguir, o aliasxse refere incorretamente a uma função de agregação: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 sobre um alias que se refira a outra função de janela de maneira direta ou transitiva. Na consulta a seguir, o alias
xse refere a uma função de janela que é inválida:SELECT count(*) over() AS x, sum(x) over() -- sum(x) over() is invalid. FROM tOs aliases de coluna reutilizáveis não são compatíveis com a sintaxe de pipe.
Os aliases de coluna reutilizáveis não são compatíveis com a Graph Query Language (GQL).