Trabaja con alias de columna reutilizables
GoogleSQL en BigQuery admite alias de columna 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, la siguiente consulta muestra cómo filtrar los resultados en función de 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 columna 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 ajustar las consultas en subconsultas.
- Mejor legibilidad: Los analistas y desarrolladores pueden declarar una expresión una vez y, luego, reutilizarla de inmediato. Esto hace que las consultas sean más fáciles de leer, depurar y mantener.
Habilita o inhabilita los alias de columna reutilizables
De forma predeterminada, los alias de columna reutilizables están inhabilitados. Para usar alias de columna, tu administrador de BigQuery debe habilitar la función configurando la opción reusable_column_aliases_mode en on con una de las siguientes instrucciones del lenguaje de definición de datos (DDL):
Para habilitar los alias de columna a nivel de la organización, usa la instrucción ALTER ORGANIZATION SET OPTIONS.
Para habilitar los alias de columna a nivel del proyecto, usa la instrucción ALTER PROJECT SET OPTIONS.
Para configurar esta opción de configuración, necesitas el rol 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 configurar las opciones de configuración, consulta
Permisos necesarios
en la página Administra la configuración.
Para inhabilitar los alias de columna reutilizables, establece reusable_column_aliases_mode en off.
Si estableces el valor en NULL, se usa el valor predeterminado del sistema y la función también se inhabilita.
Ejemplos
Para habilitar los alias de columna reutilizables a nivel de la organización, ingresa la siguiente instrucción DDL:
ALTER ORGANIZATION
SET OPTIONS (
`region-<code><var>REGION</var></code>.reusable_column_aliases_mode` = "on"
);
Reemplaza REGION por tu región.
Para habilitar los alias de columna reutilizables a nivel del proyecto, ingresa la siguiente instrucción DDL:
ALTER PROJECT <code><var>PROJECT_ID</var></code>
SET OPTIONS (
`region-<code><var>REGION</var></code>.reusable_column_aliases_mode` = "on"
);
Reemplaza lo siguiente:
- REGION: 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 columna reutilizables están habilitados o inhabilitados a nivel del proyecto o de la organización consultando las siguientes vistas del esquema de información:
Para obtener más información sobre cómo trabajar con vistas del esquema de información, consulta Introducción
a INFORMATION_SCHEMA.
Cómo usar alias de columna reutilizables
Puedes usar un alias, un identificador asignado a una expresión, en una cláusula WHERE o SELECT:
- Cláusula
WHERE: Filtrado basado en una columna calculada definida en la lista SELECT. - Cláusula
SELECT: Uso de un alias calculado para definir otro alias dentro de la misma lista de proyección o para determinar qué datos muestra la consulta.
Ejemplo
En este ejemplo, se muestra cómo usar alias de columna reutilizables para calcular un valor en función de otro cálculo que definiste antes en la lista SELECT. La consulta también te 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 (desviación semántica) en el orden de resolución de nombres de la 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 tener en cuenta el orden de resolución de nombres de la consulta. BigQuery resuelve los nombres en el siguiente orden:
- Nombre de columna: Las columnas existentes en la tabla siempre tienen la prioridad más alta.
- Alias: El alias definido en la consulta.
- Columna de consulta externa: Columnas de una consulta superior.
- Argumento de función: Si se ejecuta dentro de una función definida por el usuario (UDF) o una función con valores de tabla (TVF).
- Variables de secuencia de comandos: 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 defines en tu cláusula SELECT, BigQuery usa 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 columna 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 genera que se use la columna de consulta externa. Con los alias de columna reutilizables habilitados, el alias "sombreado" la columna de 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 category_id varía según la fila. Si habilitas los alias de columna reutilizables, la consulta usa el valor del alias de 100 para todas las filas.
Conflicto con argumentos de 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
que se pasa a la función (100) y el resultado se calcula como 110 (100 +
10). Si habilitas los alias de columna reutilizables, la consulta usa el alias definido en
la lista SELECT (5) y el resultado se calcula como 15 (5 + 10).
Conflicto con variables de secuencia de comandos
Si no habilitas los alias de columna 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 sombreado 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 la establece como alias 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;
Si no habilitas los alias de columna 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 del 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 columna reutilizables, ten en cuenta las siguientes prácticas recomendadas:
- Antes de habilitar los alias de columna reutilizables, evalúa su impacto en tus cargas de trabajo existentes.
- Para evitar comportamientos no deseados o cambios de comportamiento silenciosos (desviación semántica), no uses el nombre de las variables de secuencia de comandos, los argumentos de función o las columnas en consultas externas como el nombre de tu alias.
- Si migras SQL desde un dialecto de origen que admite semánticas 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 columna
En los siguientes ejemplos, se muestra cómo solucionar problemas habituales con alias de columna 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. Dale a tu alias un nombre único para evitar este conflicto.
Error: Column not found.
Solución: Asegúrate de no usar una referencia directa. Solo puedes hacer referencia a un alias que se definió antes de su uso. Esto se evalúa de izquierda a derecha.
Error: Column name is ambiguous.
Solución: Asegúrate de que el nombre del alias no se defina más de una vez en la misma
SELECT lista antes de que se haga referencia a él.
Limitaciones
Los alias de columna reutilizables están sujetos a las siguientes limitaciones:
Cuando una consulta incluye agrupamiento o agregación, no se permiten alias para expresiones no agregadas (columnas de agrupamiento o proyecciones de columnas de agrupamiento) en la cláusula
WHEREni como argumentos para funciones de agregación. En la siguiente consulta, el aliasbhace referencia de forma incorrecta a una expresión que incluyea, que es una columna de agrupamiento: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 aLos alias que hacen referencia a una función agregada o analítica de forma directa o transitiva no se pueden usar en la cláusula
WHEREni como argumentos para otras funciones de agregación. En la siguiente consulta, el aliasxhace 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 hace referencia a otra función analítica de forma directa o transitiva. En la siguiente consulta, el alias
xhace 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 tLa sintaxis de canalización no admite alias de columna reutilizables.
Graph Query Language (GQL) no admite alias de columna reutilizables .