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 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 PROJECT PROJECT_ID
SET 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:

  1. Nome da coluna: as colunas atuais na tabela sempre têm a prioridade mais alta.
  2. Alias: o alias definido na consulta.
  3. Coluna de consulta externa: colunas de uma consulta mãe.
  4. 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).
  5. 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 WHERE ou como argumentos para funções agregadas. Na consulta a seguir, o alias b se refere incorretamente a uma expressão que inclui a, 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 a
    
  • Os 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 WHERE ou como argumentos para outras funções de agregação. Na consulta a seguir, o alias x se 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 x se refere a uma função de janela que é inválida:

    SELECT count(*) over() AS x, sum(x) over() -- sum(x) over() is invalid.
    FROM t
    
  • Os 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).