表函数¶
表函数为每个输入行返回一组行。返回的集合可以包含零行、一行或多行。每行可以包含一列或多列。
表函数有时称为“表格函数”。
本主题内容:
什么是表函数?¶
当函数为每个单独的输入返回多行时,通常使用表函数。
每次调用表函数时,它都可以返回不同数量的行。例如,函数 record_high_temperatures_for_date()
返回指定日期的高温记录列表,可能在 4 月 10 日返回 0 行,6 月 10 日返回 1 行,8 月 20 日返回 40 行。
表函数的简单示例¶
以下函数适合作为表函数:
接受账户和日期,并返回在该日期记入该账户的所有费用的函数。(在某一特定日期可能会收取多项费用。)
接受用户 ID 并返回分配给该用户的数据库角色的函数。(用户可能具有多个角色,包括“sysadmin”和“useradmin”。)
每个输出行依赖于多个输入行的函数¶
表函数可以根据影响每个输出行的输入行数分为两类:
1 对 N
M 对 N
前面描述的函数是 1 对 N 表函数:每个输出行仅依赖于一个输入行。例如,函数 record_high_temperatures_for_date()
可能会产生多个输出行(在该日期达到记录的每个城市一行)。特定输入日期的每个输出行仅取决于该日期;每个输出行都独立于每隔一个日期的行。
Snowflake 还支持 M 到 N 表函数:每个输出行可以依赖于多个输入行。例如,如果函数生成股票价格的移动平均线,则该函数使用来自多个输入行(多个日期)的股票价格来生成每个输出行。
更一般地说,在 M 到 N 函数中,一组 M 个输入行生成一组 N 个输出行。M 可以是一行或多行。N 可以是零行、一行或多行。
例如,在 10 天移动平均线中,M 为 10。N 为 1,因为每组 10 个输入行生成一个平均价格。
内置表函数与用户定义表函数¶
Snowflake 提供了数百个内置函数,其中许多是表函数。内置表函数在 系统定义表函数 中列出。
用户还可以编写自己的函数,称为用户定义函数或“UDFs”。有些 UDFs 是标量的;有些是表格的。用户定义表函数称为“UDTFs”。有关 UDFs (包括 UDTFs)的信息,请参阅 用户定义函数概述。
内置表函数和用户定义表函数通常遵循相同的规则;例如,它们的调用方式与 SQL 语句相同。
使用表函数¶
在 FROM 子句中使用表函数¶
表包含一组行。同样,表函数返回一组行。表和表函数都用于需要一组行的上下文中。具体来说,表函数用于 SQL 语句的 FROM 子句中。
为了帮助 SQL 编译器将表函数识别为行源,Snowflake 要求表函数调用由 TABLE()
关键字封装。
例如,以下语句调用名为 record_high_temperatures_for_date()
的表函数,该函数将值 DATE 作为实参:
SELECT city_name, temperature FROM TABLE(record_high_temperatures_for_date('2021-06-27'::DATE)) ORDER BY city_name;
有关 TABLE()
的语法的更多信息,请参阅 表字面量。
表函数与一般函数一样,可以在每次调用中接受零个、一个或多个输入实参。每个实参必须是标量表达式。
有关表函数调用语法的更多详细信息,请参阅 语法 (本主题内容)。
使用表作为表函数的输入¶
表函数的实参可以是字面量或表达式,例如表的列。例如,下面的 SELECT 语句将表中的值作为实参传递给表函数:
CREATE OR REPLACE table dates_of_interest (event_date DATE);
INSERT INTO dates_of_interest (event_date) VALUES
('2021-06-21'::DATE),
('2022-06-21'::DATE);
CREATE OR REPLACE FUNCTION record_high_temperatures_for_date(d DATE)
RETURNS TABLE (event_date DATE, city VARCHAR, temperature NUMBER)
as
$$
SELECT d, 'New York', 65.0
UNION ALL
SELECT d, 'Los Angeles', 69.0
$$;
SELECT
doi.event_date as "Date",
record_temperatures.city,
record_temperatures.temperature
FROM dates_of_interest AS doi,
TABLE(record_high_temperatures_for_date(doi.event_date)) AS record_temperatures
ORDER BY doi.event_date, city;
+------------+-------------+-------------+
| Date | CITY | TEMPERATURE |
|------------+-------------+-------------|
| 2021-06-21 | Los Angeles | 69 |
| 2021-06-21 | New York | 65 |
| 2022-06-21 | Los Angeles | 69 |
| 2022-06-21 | New York | 65 |
+------------+-------------+-------------+
表函数的实参可以来自其他类似表的源,包括视图和其他表函数。
系统定义表函数列表¶
Snowflake 提供以下系统定义(即内置)表函数:
子类别 |
函数 |
备注 |
---|---|---|
数据加载 |
有关更多信息,请参阅 将数据载入 Snowflake。 |
|
数据生成 |
||
数据转换 |
||
Snowflak Cortex ML 函数 |
有关更多信息,请参阅 Snowflake Cortex ML 函数。 |
|
对象建模 |
||
半结构化查询 |
有关更多信息,请参阅 查询半结构化数据。 |
|
查询结果 |
可用于对另一个 SQL 操作的输出执行 SQL 操作(例如 SHOW)。 |
|
查询配置文件 |
||
历史和使用信息 |
||
用户登录
|
||
查询
|
||
有关更多信息,请参阅 使用 Query Acceleration Service。 |
||
仓库和存储使用情况
|
||
列级和行级安全性
|
||
Object Tagging
|
Information Schema 表函数。 |
|
Information Schema 表函数。 |
||
Account Usage 表函数。 |
||
账户复制
|
有关更多信息,请参阅 跨多个账户的复制和故障转移简介 |
|
REPLICATION_GROUP_REFRESH_PROGRESS、REPLICATION_GROUP_REFRESH_PROGRESS_BY_JOB |
||
数据库复制
|
有关更多信息,请参阅 跨多个账户复制数据库。 |
|
数据加载和传输
|
||
数据群集(在表内)
|
有关更多信息,请参阅 自动聚类。 |
|
动态表
|
有关更多信息,请参阅 使用动态表。 |
|
External Functions
|
有关更多信息,请参阅 编写外部函数。 |
|
外部表
|
有关更多信息,请参阅 使用 External Tables。 |
|
物化视图维护
|
有关更多信息,请参阅 使用物化视图。 |
|
通知
|
有关更多信息,请参阅 使用 SYSTEM$SEND_EMAIL 发送电子邮件通知。 |
|
SCIM 维护
|
有关更多信息,请参阅 审计 SCIM API 请求 |
|
搜索优化维护
|
有关更多信息,请参阅 搜索优化服务。 |
|
流
|
有关更多信息,请参阅 使用表流进行变更跟踪。 |
|
任务
|
有关更多信息,请参阅 任务简介。 |
|
网络规则 |
Information Schema 表函数。有关详细信息,请参阅 网络规则。 |
语法¶
SELECT ...
FROM [ <input_table> [ [AS] <alias_1> ] ,
[ LATERAL ]
]
TABLE( <table_function>( [ <arg_1> [, ... ] ] ) ) [ [ AS ] <alias_2> ];
有关特定于函数的语法,请参阅各个系统定义表函数的文档。