在传统的SQL
中,用户可以使用表通配符函数,如TABLE_DATE_RANGE
、TABLE_QUERY
和TABLE_DATE_RANGE_STRICT
。
标准SQL
是否有类似的功能?
在遗留SQL中,用户可以使用表通配符函数引用数据集中表的子集中的数据。在标准SQL中,用户可以使用UNION ALL
获得相同的结果。然而,当用户想要使用例如日期范围(在传统SQL中使用TABLE_DATE_RANGE
和TABLE_DATE_RANGE_STRICT
支持)或其他复杂标准(在传统SQL中使用TABLE_QUERY
支持)来动态确定表集时,这种方法可能不方便。对于标准SQL,BigQuery提供了一个与下面描述的等价的功能。
以下使用TABLE_QUERY
通配符函数的遗留SQL查询可以使用标准SQL重写。
旧版SQL查询(使用TABLE_QUERY
):
SELECT SUM(value1)
FROM TABLE_QUERY([myproject:mydataset],"table_id = 'mydailytable_20150105' OR
table_id = 'mydailytable_20150106' OR table_id = 'maydailytable_20150110'")
GROUP BY value2;
旧版SQL查询(使用TABLE_DATE_RANGE
):
SELECT SUM(value1)
FROM TABLE_DATE_RANGE([myproject:mydataset], TIMESTAMP("2015-01-05"), TIMESTAMP("2015-01-10"))
标准SQL查询:
SELECT SUM(value1)
FROM `myproject.mydataset.mydailytable_*`
WHERE _TABLE_SUFFIX = '20150105'
OR _TABLE_SUFFIX = '20150106'
OR _TABLE_SUFFIX = '20150110'
GROUP BY value2;
在上面的查询中,通配符表myproject.mydataset.mydailytable_*
匹配数据集myproject.mydataset
中具有以mydailytable_
开头的table_id
的所有表。例如,为了匹配数据集中的所有表,用户可以为通配符使用空前缀。因此,myproject.mydataset.*
匹配数据集中的所有表。
由于*
是一个特殊字符,所以在查询中使用通配符表名时必须将其引用。
_TABLE_SUFFIX
伪列:
_TABLE_SUFFIX
伪列的类型为STRING,可以像使用任何其他列一样使用。它是一个保留的列名,因此在将其用作SELECT列表的一部分时需要对其进行别名处理。
此功能的官方文档可在此处获取:
https://cloud.google.com/bigquery/docs/wildcard-tableshttps://cloud.google.com/bigquery/docs/querying-wildcard-tables