Trabaja con alias de columnas reutilizables

GoogleSQL en BigQuery admite alias de columnas reutilizables. Un alias de columna reutilizable te permite definir un alias para una expresión en la cláusula SELECT de una consulta en SQL y hacer referencia a ese alias de inmediato dentro de la misma lista SELECT o en la cláusula WHERE del mismo bloque de consulta.

Por ejemplo, en la siguiente consulta, se muestra cómo filtrar los resultados según un cálculo, como gross_price. Puedes hacer referencia al alias gross_price directamente en la cláusula WHERE en lugar de repetir el cálculo en la cláusula WHERE o usar una subconsulta:

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

Los alias de columnas reutilizables te proporcionan lo siguiente:

  • Sintaxis de SQL simplificada: Puedes escribir cálculos limpios, concisos y de izquierda a derecha sin repetir expresiones complejas ni unir consultas en subconsultas.
  • Legibilidad mejorada: Los analistas y desarrolladores pueden declarar una expresión una vez y, luego, volver a usarla de inmediato. Esto hace que las consultas sean más fáciles de leer, depurar y mantener.

Habilita o inhabilita los alias de columnas reutilizables

De forma predeterminada, los alias de columnas reutilizables están inhabilitados. Para usar alias de columnas, el administrador de BigQuery debe habilitar la función configurando la opción reusable_column_aliases_mode como on con una de las siguientes sentencias del lenguaje de definición de datos (DDL):

Para establecer esta opción de configuración, necesitas el rol de administrador de BigQuery (roles/bigquery.admin) o el permiso bigquery.projects.update en el proyecto o el permiso bigquery.organizations.update en la organización. Para obtener información sobre los permisos necesarios para establecer las opciones de configuración, consulta Permisos obligatorios en la página Administra los parámetros de configuración.

Para inhabilitar los alias de columnas reutilizables, establece reusable_column_aliases_mode en off. Si estableces el valor en NULL, se usa el valor predeterminado del sistema y también se inhabilita la función.

Ejemplos

Para habilitar los alias de columnas reutilizables a nivel de la organización, ingresa la siguiente sentencia de DDL:

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

Reemplaza REGION por tu región.

Para habilitar los alias de columnas reutilizables a nivel del proyecto, ingresa la siguiente sentencia de DDL:

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

Reemplaza lo siguiente:

  • REGION: Es tu región.
  • PROJECT_ID: Es el ID del proyecto.

Verifica si los alias de columna están habilitados o inhabilitados

Puedes verificar si los alias de columnas reutilizables están habilitados o inhabilitados a nivel de proyecto o de organización consultando las siguientes vistas del esquema de información:

Para obtener más información sobre cómo trabajar con vistas de esquemas de información, consulta Introducción a INFORMATION_SCHEMA.

Cómo usar alias de columnas reutilizables

Puedes usar un alias, un identificador asignado a una expresión, en una cláusula WHERE o SELECT:

  • Cláusula WHERE: Filtra según una columna calculada definida en la lista SELECT.
  • Cláusula SELECT: Usa un alias calculado para definir otro alias dentro de la misma lista de proyección o para determinar qué datos devuelve la consulta.

Ejemplo

En este ejemplo, se muestra cómo usar alias de columnas reutilizables para calcular un valor en función de otro cálculo que definiste antes en la lista SELECT. En la consulta, también se muestra cómo hacer referencia al alias en la 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;

Cambios de comportamiento (desvío semántico) en el orden de resolución de nombres de consulta

Un nombre de identificador puede existir como una columna física en tu tabla y como un alias que creas, por lo que debes considerar el orden de resolución de nombres de la consulta. BigQuery resuelve los nombres en el siguiente orden:

  1. Nombre de la columna: Las columnas existentes en la tabla siempre tienen la prioridad más alta.
  2. Alias: Es el alias definido en la consulta.
  3. Columna de consulta externa: Son columnas de una consulta superior.
  4. Argumento de función: si se ejecuta dentro de una función definida por el usuario (UDF) o una función con valor de tabla (TVF).
  5. Variables de secuencia de comandos: Son variables definidas en una secuencia de comandos.

Según este orden, si tu tabla tiene una columna llamada gross_price y creas un alias llamado gross_price, la consulta usa el valor de la columna, no tu alias.

Esto significa que, si tienes una columna de consulta externa, un argumento de función o una variable de secuencia de comandos con el mismo nombre que un alias que definas en tu cláusula SELECT, BigQuery usará el valor del alias para los cálculos en lugar de la variable o el argumento.

Ejemplos de cómo funciona el orden de resolución de nombres

En los siguientes ejemplos, se muestra cómo funciona el orden de resolución de nombres con alias de columnas reutilizables cuando hay conflictos de nombres.

Conflicto con una columna de consulta externa

Si no habilitas los alias de columna reutilizables, un alias definido en la cláusula SELECT que tiene el mismo nombre que una columna en la consulta externa hace que se use la columna de la consulta externa. Con los alias de columna reutilizables habilitados, el alias "oculta" la columna de la consulta externa dentro del alcance de la consulta.

En el siguiente ejemplo, una consulta anidada usa alias y tiene acceso a las columnas de la 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;

Si no habilitas los alias de columna reutilizables, la subconsulta usa la columna category_id de la tabla product en la consulta externa. Como resultado, el valor de category_id varía según la fila. Si habilitas los alias de columna reutilizables, la consulta usa el valor de alias de 100 para todas las filas.

Conflicto con los argumentos de la función

Si una consulta se ejecuta dentro de una función definida por el usuario (UDF), un alias definido dentro de esa consulta tiene prioridad sobre los argumentos de la función.

En el siguiente ejemplo, la función calculate_metric tiene un argumento de entrada llamado 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 no habilitas los alias de columna reutilizables, la consulta usa el valor del argumento pasado a la función (100) y el resultado se calcula como 110 (100 + 10). Si habilitas los alias de columnas reutilizables, la consulta usa el alias definido en la lista SELECT (5) y el resultado se calcula como 15 (5 + 10).

Conflicto con las variables de la secuencia de comandos

Si no habilitas los alias de columnas reutilizables y tienes un alias definido en la cláusula SELECT que tiene el mismo nombre que una variable de secuencia de comandos, se usa la variable de secuencia de comandos. Si habilitas los alias de columna reutilizables, el alias oculta la variable dentro del alcance de la consulta.

En el siguiente ejemplo, se declara una variable llamada gross_price que tiene un valor predeterminado de 10.0. La consulta también calcula una columna y le asigna el 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 no habilitas los alias de columnas reutilizables, la consulta usa el valor de la variable de 10.0. El resultado es un valor discounted_gross_price de 5.0 que es una constante para todas las filas. El resultado se calcula como 10.0 * 0.5 = 5.0.

Si habilitas los alias de columna reutilizables, la consulta usa el valor de alias de net_price * 1.23. El resultado es un valor discounted_gross_price que varía por fila. El resultado se calcula como (net_price * 1.23) * 0.5.

Prácticas recomendadas

Cuando uses alias de columnas reutilizables, ten en cuenta las siguientes prácticas recomendadas:

  • Antes de habilitar los alias de columnas reutilizables, evalúa su impacto en tus cargas de trabajo existentes.
  • Para evitar comportamientos no deseados o cambios de comportamiento silenciosos (desvío semántico), no uses el nombre de las variables de la secuencia de comandos, los argumentos de la función o las columnas en las consultas externas como el nombre de tu alias.
  • Si migras SQL desde un dialecto de origen que admite la semántica de alias, como Teradata o Snowflake, sigue las instrucciones de traducción de SQL antes de comenzar la migración.

Soluciona problemas de alias de columnas

En los siguientes ejemplos, se muestra cómo solucionar problemas habituales con los alias de columnas reutilizables.

Problema: Obtienes resultados de consulta inesperados o parece que se ignora el alias.

Solución: Verifica el orden de resolución de nombres. Si tu tabla contiene una columna con el mismo nombre que tu alias, el nombre de la columna tiene mayor prioridad que el alias. Asigna un nombre único a tu alias para evitar este conflicto.

Error: Column not found.

Resolución: Asegúrate de no usar una referencia hacia delante. Solo puedes hacer referencia a un alias que se haya definido antes de su uso. Esto se evalúa de izquierda a derecha.

Error: Column name is ambiguous.

Resolución: Asegúrate de que el nombre del alias no se defina más de una vez en la misma lista SELECT antes de que se haga referencia a él.

Limitaciones

Los alias de columnas reutilizables están sujetos a las siguientes limitaciones:

  • Cuando una consulta incluye agrupaciones o agregaciones, no se permiten alias para expresiones no agregadas (columnas de agrupación o proyecciones de columnas de agrupación) en la cláusula WHERE ni como argumentos para funciones de agregación. En la siguiente consulta, el alias b hace referencia de forma incorrecta a una expresión que incluye a, que es una columna de agrupación:

    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
    
  • Los alias que hacen referencia a una función de agregación o analítica de forma directa o transitiva no se pueden usar en la cláusula WHERE ni como argumentos para otras funciones de agregación. En la siguiente consulta, el alias x hace referencia de forma incorrecta a una función de agregación:

    SELECT sum(a) AS x, sum(x) -- sum(x) is invalid.
    FROM t
    WHERE x > 0          -- Referencing x under WHERE clause is not allowed.
    
  • No se permite aplicar una función analítica sobre un alias que haga referencia a otra función analítica de forma directa o transitiva. En la siguiente consulta, el alias x hace referencia a una función analítica que no es válida:

    SELECT count(*) over() AS x, sum(x) over() -- sum(x) over() is invalid.
    FROM t
    
  • La sintaxis de canalización no admite alias de columnas reutilizables.

  • El lenguaje de consulta de gráficos (GQL) no admite alias de columnas reutilizables.