通配符表

借助通配符表,您可以使用简洁的 SQL 语句查询多个表。只有标准 SQL 才提供通配符表。如需在旧版 SQL 中使用同等功能,请参阅表通配符函数

通配符表语法

通配符表语法:

SELECT
FROM
  `<project-id>.<dataset-id>.<table-prefix>*`
WHERE
  bool_expression
<project-id>
Cloud Platform 项目 ID。如果您使用默认项目 ID,则此参数为可选项。
<dataset-id>
BigQuery 数据集 ID。
<table-prefix>
所有与通配符匹配的表所共有的字符串。表前缀是可选项。省略表前缀将匹配数据集中的所有表。
*(通配符)
通配符“*”表示表名中的一个或多个字符。通配符只能作为通配符表名的最后一个字符出现。

通配符表 WHERE 子句还支持 _TABLE_SUFFIX 伪列,该列中包含与通配符匹配的值。您可以使用 _TABLE_SUFFIX 通过比较运算符过滤查询。例如,以下 WHERE 子句使用了比较运算符:

WHERE
  _TABLE_SUFFIX BETWEEN '29' AND '40'

WHERE
  _TABLE_SUFFIX = '1929'

WHERE
  _TABLE_SUFFIX < '1941'

如需详细了解 _TABLE_SUFFIX 伪列,请参阅使用 _TABLE_SUFFIX 过滤选定表

用英文反引号将带通配符的表名括住

通配符表名包含特殊字符 (*),因此您必须将通配符表名用英文反引号 (`) 引起来。例如,以下查询使用了反引号,因而是有效查询:

#standardSQL
/* Valid standard SQL query */
SELECT
  max
FROM
  `bigquery-public-data.noaa_gsod.gsod*`
WHERE
  max != 9999.9 # code for missing data
  AND _TABLE_SUFFIX = '1929'
ORDER BY
  max DESC

以下查询没有正确使用英文反引号括住,因而是无效查询:

#standardSQL
/* Syntax error: Expected end of statement but got "-" at [4:11] */
SELECT
  max
FROM
  # missing backticks
  bigquery-public-data.noaa_gsod.gsod*
WHERE
  max != 9999.9 # code for missing data
  AND _TABLE_SUFFIX = '1929'
ORDER BY
  max DESC

普通引号不起作用:

#standardSQL
/* Syntax error: Unexpected string literal: 'bigquery-public-data.noaa_gsod.gsod*' at [4:3] */
SELECT
  max
FROM
  # quotes are not backticks
  'bigquery-public-data.noaa_gsod.gsod*'
WHERE
  max != 9999.9 # code for missing data
  AND _TABLE_SUFFIX = '1929'
ORDER BY
  max DESC

迁移旧版 SQL 表通配符函数

在旧版 SQL 中,您可以使用以下表通配符函数查询多个表。

  • TABLE_DATE_RANGE()TABLE_DATE_RANGE_STRICT()
  • TABLE_QUERY()

TABLE_DATE_RANGE() 函数

旧版 SQL TABLE_DATE_RANGE() 函数适用于符合特定命名方案 <prefix>YYYYMMDD 的表,其中 <prefix> 表示表名的第一部分,YYYYMMDD 表示与该表的数据关联的日期。

例如,以下旧版 SQL 查询从一组包含西雅图区域天气数据的日常表中查找平均温度:

#legacySQL
SELECT
  ROUND(AVG(TemperatureF),1) AS AVG_TEMP_F
FROM
  TABLE_DATE_RANGE([mydataset.sea_weather_],
                    TIMESTAMP("2016-05-01"),
                    TIMESTAMP("2016-05-09"))

在标准 SQL 中,等效查询使用表通配符和 BETWEEN 子句。

#standardSQL
SELECT
  ROUND(AVG(TemperatureF),1) AS AVG_TEMP_F
FROM
  `mydataset.sea_weather_*`
WHERE
  _TABLE_SUFFIX BETWEEN '20160501' AND '20160509'

TABLE_QUERY() 函数

旧版 SQL TABLE_QUERY() 函数可以根据模式查找表名。如果将 TABLE_QUERY() 函数迁移到标准 SQL,由于标准 SQL 不支持 TABLE_QUERY() 函数,您可以改用 _TABLE_SUFFIX 伪列进行过滤。迁移时,请牢记以下几点差异:

  • 在旧版 SQL 中,应将 TABLE_QUERY() 函数放入 FROM 子句中,而在标准 SQL 中,应在 WHERE 子句中使用 _TABLE_SUFFIX 伪列进行过滤。

  • 在旧版 SQL 中,TABLE_QUERY() 函数对整个表名(或 table_id)执行操作,而在标准 SQL 中,_TABLE_SUFFIX 伪列可以包含部分或整个表名,具体取决于通配符的使用方式。

使用 WHERE 子句过滤

从旧版 SQL 迁移到标准 SQL 后,需将过滤条件移至 WHERE 子句。例如,以下查询查找以数字 0 结尾的所有年份中的最高温度:

#legacySQL
SELECT
  max,
  ROUND((max-32)*5/9,1) celsius,
  year
FROM
  TABLE_QUERY([bigquery-public-data:noaa_gsod],
               'REGEXP_MATCH(table_id, r"0$")')
WHERE
  max != 9999.9 # code for missing data
  AND max > 100 # to improve ORDER BY performance
ORDER BY
  max DESC

在标准 SQL 中,等效查询使用表通配符,并将正则表达式函数 REGEXP_CONTAINS() 放入 WHERE 子句:

#standardSQL
SELECT
  max,
  ROUND((max-32)*5/9,1) celsius,
  year
FROM
  `bigquery-public-data.noaa_gsod.gsod*`
WHERE
  max != 9999.9 # code for missing data
  AND max > 100 # to improve ORDER BY performance
  AND REGEXP_CONTAINS(_TABLE_SUFFIX, r"0$")
ORDER BY
  max DESC

table_id 和 _TABLE_SUFFIX 之间的差异

在旧版 SQL TABLE_QUERY(dataset, expr) 函数中,第二个参数是一个使用 table_id 值对整个表名进行操作的表达式。迁移到标准 SQL 后,在 WHERE 子句中创建的过滤条件对 _TABLE_SUFFIX 的值进行操作,该值可以包含部分或整个表名,具体取决于通配符的使用方式。

例如,以下旧版 SQL 查询在正则表达式中使用整个表名来查找以数字 0 结尾的所有年份中的最高温度:

#legacySQL
SELECT
  max,
  ROUND((max-32)*5/9,1) celsius,
  year
FROM
  TABLE_QUERY([bigquery-public-data:noaa_gsod],
               'REGEXP_MATCH(table_id, r"gsod\d{3}0")')
WHERE
  max != 9999.9 # code for missing data
  AND max > 100 # to improve ORDER BY performance
ORDER BY
  max DESC

在标准 SQL 中,等效查询可以使用整个表名,也可以仅使用一部分表名。您可以在标准 SQL 中使用空前缀,这样过滤条件就可对整个表名进行操作:

# Standard SQL empty prefix
FROM
  `bigquery-public-data.noaa_gsod.*`

但是,使用较长前缀查询的效果要优于使用空前缀,因此以下示例使用了一个较长的前缀,也就是说,_TABLE_SUFFIX 的值只是表名的一部分。

#standardSQL
SELECT
  max,
  ROUND((max-32)*5/9,1) celsius,
  year
FROM
  `bigquery-public-data.noaa_gsod.gsod*`
WHERE
  max != 9999.9 # code for missing data
  AND max > 100 # to improve ORDER BY performance
  AND REGEXP_CONTAINS(_TABLE_SUFFIX, r"\d{3}0")
ORDER BY
  max DESC
此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
需要帮助?请访问我们的支持页面