¿Puedo usar un parámetro de consulta en el nombre de una tabla?

Resuelto Thomas asked hace 54 años • 3 respuestas

Quiero hacer algo como:

SELECT some_things
FROM `myproject.mydataset.mytable_@suffix`

Pero esto no funciona porque el parámetro no se expande dentro del nombre de la tabla.

Esto funciona , usando tablas comodín :

SELECT some_things
FROM `myproject.mydataset.mytable_*`
WHERE _TABLE_SUFFIX = @suffix

Sin embargo, tiene algunos problemas:

  • Si escribo mal el parámetro, esta consulta silenciosamente devuelve cero filas, en lugar de gritarme en voz alta.

  • El almacenamiento en caché de consultas deja de funcionar cuando se realizan consultas con un comodín.

  • Si existen otras tablas con el mytable_prefijo, deben tener el mismo esquema, incluso si no coinciden con el sufijo. De lo contrario, suceden cosas raras. Parece que BigQuery calcula la unión de todas las columnas o toma el esquema de una tabla arbitraria; No está documentado y no lo miré en detalle.

¿Existe una mejor manera de consultar una sola tabla cuyo nombre depende de un parámetro de consulta?

Thomas avatar Jan 01 '70 08:01 Thomas
Aceptado

Sí, puedes, aquí tienes un ejemplo práctico:

DECLARE tablename STRING;
DECLARE tableQuery STRING;

##get list of tables
CREATE TEMP TABLE tableNames as select table_name from nomo_nausea.INFORMATION_SCHEMA.TABLES where table_name not in ('_sdc_primary_keys', '_sdc_rejected', 'fba_all_order_report_data');

WHILE (select count(*) from tableNames) >= 1 DO
  SET tablename = (select table_name from tableNames LIMIT 1);
  ##build dataset + table name
  SET tableQuery = CONCAT('nomo_nausea.' , tablename);
  ##use concat to build string and execute
  EXECUTE IMMEDIATE CONCAT('SELECT * from `', tableQuery, '` where _sdc_deleted_at is not null');
  DELETE FROM tableNames where table_name = tablename;
END WHILE;
grantr avatar Feb 26 '2021 05:02 grantr

Para responder a sus problemas planteados:

  1. El escaneo de la tabla se realiza en la cláusula FROM, en la cláusula WHERE se realiza el filtrado [ 1 ], por lo que si la condición WHERE no coincide, se devolverá un resultado vacío.

  2. "Actualmente, los resultados almacenados en caché no se admiten cuando se realizan consultas con comodines" [ 2 ].

  3. "BigQuery usa el esquema de la tabla creada más recientemente que coincide con el comodín como esquema" [ 3 ]. ¿A qué tipo de cosas raras te has enfrentado en tu caso de uso? "Una tabla comodín representa una unión de todas las tablas que coinciden con la expresión comodín" [ 4 ].

En BigQuery se pueden ejecutar consultas parametrizadas, pero los nombres de las tablas no se pueden parametrizar [ 5 ]. Su solución comodín parece ser la única manera.

Yurci avatar Jul 23 '2018 13:07 Yurci