表函数

表函数(也称为表值函数 (TVF))是用户定义的函数,表函数会返回表。您可以在可使用表的任何位置使用表函数。表函数的行为与视图类似,但表函数可以接受参数。

创建表函数

要创建表函数,请使用 CREATE TABLE FUNCTION 语句。表函数包含生成表的查询。函数会返回查询结果。以下表函数接受 INT64 参数,并在针对名为 bigquery-public-data.usa_names.usa_1910_current公共数据集的查询中的 WHERE 子句内使用此值:

CREATE OR REPLACE TABLE FUNCTION mydataset.names_by_year(y INT64)
AS (
  SELECT year, name, SUM(number) AS total
  FROM `bigquery-public-data.usa_names.usa_1910_current`
  WHERE year = y
  GROUP BY year, name
);

如需以其他方式进行过滤,您可以将多个参数传递给表函数。以下表函数按年份和名称前缀过滤数据:

CREATE OR REPLACE TABLE FUNCTION mydataset.names_by_year_and_prefix(
  y INT64, z STRING)
AS (
  SELECT year, name, SUM(number) AS total
  FROM `bigquery-public-data.usa_names.usa_1910_current`
  WHERE
    year = y
    AND STARTS_WITH(name, z)
  GROUP BY year, name
);

参数名称

如果表函数参数与表列的名称相匹配,则可能会产生有歧义的引用。在这种情况下,BigQuery 会将名称解释为对表列(而不是参数)的引用。建议您使用与任何引用的表列名称不同的参数名称。

使用表函数

您可以在表在其中有效的任何上下文中调用表函数。以下示例在 SELECT 语句的 FROM 子句中调用 mydataset.names_by_year 函数:

SELECT * FROM mydataset.names_by_year(1950)
  ORDER BY total DESC
  LIMIT 5

结果如下所示:

+------+--------+-------+
| year |  name  | total |
+------+--------+-------+
| 1950 | James  | 86447 |
| 1950 | Robert | 83717 |
| 1950 | Linda  | 80498 |
| 1950 | John   | 79561 |
| 1950 | Mary   | 65546 |
+------+--------+-------+

您可以将一个表函数的输出与另一个表联接:

SELECT *
  FROM `bigquery-public-data.samples.shakespeare` AS s
  JOIN mydataset.names_by_year(1950) AS n
  ON n.name = s.word

您还可以在子查询中使用表函数:

SELECT ARRAY(
  SELECT name FROM mydataset.names_by_year(1950)
  ORDER BY total DESC
  LIMIT 5)

列出表函数

表函数是一种例程。如需列出数据集中的所有例程,请参阅列出例程

删除表函数

如需删除表函数,请使用 DROP TABLE FUNCTION 语句:

DROP TABLE FUNCTION mydataset.names_by_year

向例程授权

您可以将表函数授权为例程。借助授权例程,您可以与特定用户或群组共享查询结果,而无需为其授予生成结果的底层表的访问权限。例如,已获授权的例程可以计算对数据的聚合,也可以查找表值并在计算中使用该值。如需了解详情,请参阅已获授权的例程

限制

  • 参数必须是标量值。BigQuery 中的表函数不能将表作为输入参数。

  • 查询正文必须是 SELECT 语句,并且不能修改任何内容。例如,表函数中不允许使用数据定义语言 (DDL) 和数据操纵语言 (DML) 语句。如果您需要副作用,请考虑改为编写过程

  • 表函数必须与其引用的表存储在同一位置。

配额

如需详细了解表函数配额和限制,请参阅配额和限制