¿Puedo usar un parámetro de consulta en el nombre de una tabla?
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?
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;
Para responder a sus problemas planteados:
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.
"Actualmente, los resultados almacenados en caché no se admiten cuando se realizan consultas con comodines" [ 2 ].
"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.