Utiliser des alias de colonne réutilisables

GoogleSQL dans BigQuery est compatible avec les alias de colonne réutilisables. Un alias de colonne réutilisable vous permet de définir un alias pour une expression dans la clause SELECT d'une requête SQL et de référencer immédiatement cet alias dans la même liste SELECT ou dans la clause WHERE du même bloc de requête.

Par exemple, la requête suivante montre comment filtrer les résultats en fonction d'un calcul, tel que gross_price. Vous pouvez référencer l'alias gross_price directement dans la clause WHERE au lieu de répéter le calcul dans la clause WHERE ou d'utiliser une sous-requête :

SELECT
  net_price * 1.23 as gross_price
FROM
  product
WHERE
  gross_price < 10.0

Les alias de colonne réutilisables vous offrent les avantages suivants :

  • Syntaxe SQL simplifiée : vous pouvez écrire des calculs clairs, concis et de gauche à droite sans répéter d'expressions complexes ni encapsuler des requêtes dans des sous-requêtes.
  • Lisibilité améliorée : les analystes et les développeurs peuvent déclarer une expression une fois, puis la réutiliser immédiatement. Cela facilite la lecture, le débogage et la maintenance des requêtes.

Activer ou désactiver les alias de colonne réutilisables

Par défaut, les alias de colonne réutilisables sont désactivés. Pour utiliser des alias de colonne, votre administrateur BigQuery doit activer la fonctionnalité en définissant l'option reusable_column_aliases_mode sur on à l'aide de l'une des instructions de langage de définition de données (LDD) suivantes :

Pour définir cette option de configuration, vous devez disposer du rôle d'administrateur BigQuery (roles/bigquery.admin), de l'autorisation bigquery.projects.update sur le projet ou de l'autorisation bigquery.organizations.update sur l'organisation. Pour en savoir plus sur les autorisations requises pour définir les options de configuration, consultez la section Autorisations requises sur la page "Gérer les paramètres de configuration".

Pour désactiver les alias de colonne réutilisables, définissez reusable_column_aliases_mode sur off. Si vous définissez la valeur sur NULL, le paramètre système par défaut est utilisé et la fonctionnalité est également désactivée.

Exemples

Pour activer les alias de colonne réutilisables au niveau de l'organisation, saisissez l'instruction LDD suivante :

ALTER ORGANIZATION
SET OPTIONS (
  `region-REGION.reusable_column_aliases_mode` = "on"
);

Remplacez REGION par votre région.

Pour activer les alias de colonne réutilisables au niveau du projet, saisissez l'instruction LDD suivante :

ALTER PROJECT PROJECT_ID
SET OPTIONS (
  `region-REGION.reusable_column_aliases_mode` = "on"
);

Remplacez les éléments suivants :

  • REGION : votre région.
  • PROJECT_ID : ID de votre projet.

Vérifier si les alias de colonne sont activés ou désactivés

Vous pouvez vérifier si les alias de colonne réutilisables sont activés ou désactivés au niveau du projet ou de l'organisation en interrogeant les vues de schéma d'informations suivantes :

Pour en savoir plus sur l'utilisation des vues de schéma d'informations, consultez Présentation de INFORMATION_SCHEMA.

Utiliser des alias de colonne réutilisables

Vous pouvez utiliser un alias (un identifiant attribué à une expression) dans une clause WHERE ou SELECT :

  • Clause WHERE : filtrage basé sur une colonne calculée définie dans la liste SELECT.
  • Clause SELECT : utilisation d'un alias calculé pour définir un autre alias dans la même liste de projection ou pour déterminer les données renvoyées par la requête.

Exemple

Cet exemple vous montre comment utiliser des alias de colonne réutilisables pour calculer une valeur en fonction d'un autre calcul que vous avez défini précédemment dans la liste SELECT. La requête vous montre également comment faire référence à l'alias dans la clause 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;

Changements de comportement (dérive sémantique) dans l'ordre de résolution des noms de requête

Un nom d'identifiant peut exister en tant que colonne physique dans votre table et en tant qu'alias que vous créez. Vous devez donc tenir compte de l'ordre de résolution des noms de la requête. BigQuery résout les noms dans l'ordre suivant :

  1. Nom de colonne : les colonnes existantes de la table ont toujours la priorité la plus élevée.
  2. Alias : alias défini dans la requête.
  3. Colonne de requête externe : colonnes d'une requête parente.
  4. Argument de fonction : s'il s'exécute dans une fonction définie par l'utilisateur (UDF) ou une fonction de valeur de table (TVF).
  5. Variables de script : variables définies dans un script.

Selon cet ordre, si votre table comporte une colonne nommée gross_price et que vous créez un alias nommé gross_price, la requête utilise la valeur de la colonne, et non votre alias.

Cela signifie que si vous avez une colonne de requête externe, un argument de fonction ou une variable de script portant le même nom qu'un alias que vous définissez dans votre clause SELECT, BigQuery utilise la valeur de l'alias pour les calculs au lieu de la variable ou de l'argument.

Exemples de fonctionnement de l'ordre de résolution des noms

Les exemples suivants montrent comment l'ordre de résolution des noms fonctionne avec les alias de colonne réutilisables en cas de conflits de noms.

Conflit avec une colonne de requête externe

Si vous n'activez pas les alias de colonne réutilisables, un alias défini dans la clause SELECT qui porte le même nom qu'une colonne de la requête externe entraîne l'utilisation de la colonne de la requête externe. Lorsque les alias de colonne réutilisables sont activés, l'alias "masque" la colonne de la requête externe dans le champ d'application de la requête.

Dans l'exemple suivant, une requête imbriquée utilise des alias et a accès aux colonnes de la requête externe :

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;

Si vous n'activez pas les alias de colonne réutilisables, la sous-requête utilise la colonne category_id de la table product dans la requête externe. Par conséquent, la valeur category_id varie d'une ligne à l'autre. Si vous activez les alias de colonne réutilisables, la requête utilise la valeur d'alias de 100 pour toutes les lignes.

Conflit avec les arguments de fonction

Si une requête est exécutée dans une fonction définie par l'utilisateur (UDF), un alias défini dans cette requête est prioritaire sur les arguments de la fonction.

Dans l'exemple suivant, la fonction calculate_metric comporte un argument d'entrée nommé 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);

Si vous n'activez pas les alias de colonne réutilisables, la requête utilise la valeur d'argument transmise à la fonction (100) et le résultat est calculé comme 110 (100 + 10). Si vous activez les alias de colonne réutilisables, la requête utilise l'alias défini dans la liste SELECT (5) et le résultat est calculé comme 15 (5 + 10).

Conflit avec les variables de script

Si vous n'activez pas les alias de colonne réutilisables et que vous avez défini un alias dans la clause SELECT portant le même nom qu'une variable de script, la variable de script est utilisée. Si vous activez les alias de colonne réutilisables, l'alias masque la variable dans le champ d'application de la requête.

L'exemple suivant déclare une variable nommée gross_price dont la valeur par défaut est 10.0. La requête calcule également une colonne et lui attribue l'alias 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;

Si vous n'activez pas les alias de colonne réutilisables, la requête utilise la valeur de variable de 10.0. Le résultat est une valeur discounted_gross_price de 5.0 qui est une constante pour toutes les lignes. Le résultat est calculé comme suit : 10.0 * 0.5 = 5.0.

Si vous activez les alias de colonne réutilisables, la requête utilise la valeur d'alias de net_price * 1.23. Le résultat est une valeur discounted_gross_price qui varie par ligne. Le résultat est calculé comme suit : (net_price * 1.23) * 0.5.

Bonnes pratiques

Lorsque vous utilisez des alias de colonne réutilisables, tenez compte des bonnes pratiques suivantes :

  • Avant d'activer les alias de colonne réutilisables, évaluez leur impact sur vos charges de travail existantes.
  • Pour éviter tout comportement involontaire ou tout changement de comportement silencieux (dérive sémantique), n'utilisez pas le nom de vos variables de script, arguments de fonction ou colonnes dans les requêtes externes comme nom d'alias.
  • Si vous migrez du code SQL à partir d'un dialecte source compatible avec la sémantique d'alias, tel que Teradata ou Snowflake, suivez les instructions de traduction SQL avant de commencer la migration.

Résoudre les problèmes liés aux alias de colonne

Les exemples suivants vous montrent comment résoudre les problèmes courants liés aux alias de colonne réutilisables.

Problème : vous obtenez des résultats de requête inattendus ou l'alias semble être ignoré.

Solution : Vérifiez l'ordre de résolution des noms. Si votre table contient une colonne portant le même nom que votre alias, le nom de la colonne est prioritaire par rapport à l'alias. Attribuez un nom unique à votre alias pour éviter ce conflit.

Erreur : Column not found.

Solution : assurez-vous de ne pas utiliser de référence avant. Vous ne pouvez référencer un alias que s'il a été défini avant son utilisation. Cette expression est évaluée de gauche à droite.

Erreur : Column name is ambiguous.

Résolution : Assurez-vous que le nom de l'alias n'est pas défini plus d'une fois dans la même liste SELECT avant d'être référencé.

Limites

Les alias de colonne réutilisables sont soumis aux limites suivantes :

  • Lorsqu'une requête inclut un regroupement ou une agrégation, les alias d'expressions non agrégées (colonnes de regroupement ou projections de colonnes de regroupement) ne sont pas autorisés dans la clause WHERE ni en tant qu'arguments de fonctions d'agrégation. Dans la requête suivante, l'alias b fait référence de manière incorrecte à une expression qui inclut a, qui est une colonne de regroupement :

    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
    
  • Les alias qui font référence à une fonction d'agrégation ou de fenêtrage directement ou de manière transitive ne peuvent pas être utilisés dans la clause WHERE ni comme arguments d'autres fonctions d'agrégation. Dans la requête suivante, l'alias x fait référence de manière incorrecte à une fonction d'agrégation :

    SELECT sum(a) AS x, sum(x) -- sum(x) is invalid.
    FROM t
    WHERE x > 0          -- Referencing x under WHERE clause is not allowed.
    
  • Il n'est pas possible d'appliquer un fenêtrage sur un alias qui fait référence à un autre fenêtrage directement ou de manière transitive. Dans la requête suivante, l'alias x fait référence à une fenêtrage non valide :

    SELECT count(*) over() AS x, sum(x) over() -- sum(x) over() is invalid.
    FROM t
    
  • Les alias de colonne réutilisables ne sont pas compatibles avec la syntaxe de pipe.

  • Les alias de colonne réutilisables ne sont pas compatibles avec le langage GQL (Graph Query Language).