表函数

表函数为每个输入行返回一组行。返回的集合可以包含零行、一行或多行。每行可以包含一列或多列。

表函数有时称为“表格函数”。

本主题内容:

什么是表函数?

当函数为每个单独的输入返回多行时,通常使用表函数。

每次调用表函数时,它都可以返回不同数量的行。例如,函数 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;
Copy

有关 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
    $$;
Copy
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 |
+------------+-------------+-------------+
Copy

表函数的实参可以来自其他类似表的源,包括视图和其他表函数。

系统定义表函数列表

Snowflake 提供以下系统定义(即内置)表函数:

子类别

函数

备注

数据加载

INFER_SCHEMA

有关更多信息,请参阅 将数据载入 Snowflake

VALIDATE

数据生成

GENERATOR

数据转换

SPLIT_TO_TABLE

STRTOK_SPLIT_TO_TABLE

Snowflak Cortex ML 函数

TOP_INSIGHTS (SNOWFLAKE.ML)

有关更多信息,请参阅 Snowflake Cortex ML 函数

对象建模

GET_OBJECT_REFERENCES

半结构化查询

FLATTEN

有关更多信息,请参阅 查询半结构化数据

查询结果

RESULT_SCAN

可用于对另一个 SQL 操作的输出执行 SQL 操作(例如 SHOW)。

查询配置文件

GET_QUERY_OPERATOR_STATS

历史和使用信息

Snowflake Information SchemaAccount Usage):

用户登录

LOGIN_HISTORY、LOGIN_HISTORY_BY_USER

查询

QUERY_HISTORY、QUERY_HISTORY_BY_*

QUERY_ACCELERATION_HISTORY

有关更多信息,请参阅 使用 Query Acceleration Service

仓库和存储使用情况

DATABASE_STORAGE_USAGE_HISTORY

WAREHOUSE_LOAD_HISTORY

WAREHOUSE_METERING_HISTORY

STAGE_STORAGE_USAGE_HISTORY

列级和行级安全性

POLICY_REFERENCES

Object Tagging

TAG_REFERENCES

Information Schema 表函数。

TAG_REFERENCES_ALL_COLUMNS

Information Schema 表函数。

TAG_REFERENCES_WITH_LINEAGE

Account Usage 表函数。

账户复制

REPLICATION_GROUP_REFRESH_HISTORY

有关更多信息,请参阅 跨多个账户的复制和故障转移简介

REPLICATION_GROUP_REFRESH_PROGRESS、REPLICATION_GROUP_REFRESH_PROGRESS_BY_JOB

REPLICATION_GROUP_USAGE_HISTORY

数据库复制

DATABASE_REFRESH_HISTORY

有关更多信息,请参阅 跨多个账户复制数据库

DATABASE_REFRESH_PROGRESS、DATABASE_REFRESH_PROGRESS_BY_JOB

DATABASE_REPLICATION_USAGE_HISTORY

数据加载和传输

COPY_HISTORY

DATA_TRANSFER_HISTORY

PIPE_USAGE_HISTORY

STAGE_DIRECTORY_FILE_REGISTRATION_HISTORY

VALIDATE_PIPE_LOAD

数据群集(在表内)

AUTOMATIC_CLUSTERING_HISTORY

有关更多信息,请参阅 自动聚类

动态表

DYNAMIC_TABLES

有关更多信息,请参阅 使用动态表

DYNAMIC_TABLE_GRAPH_HISTORY

DYNAMIC_TABLE_REFRESH_HISTORY

External Functions

EXTERNAL_FUNCTIONS_HISTORY

有关更多信息,请参阅 编写外部函数

外部表

AUTO_REFRESH_REGISTRATION_HISTORY

有关更多信息,请参阅 使用 External Tables

EXTERNAL_TABLE_FILES

EXTERNAL_TABLE_FILE_REGISTRATION_HISTORY

物化视图维护

MATERIALIZED_VIEW_REFRESH_HISTORY

有关更多信息,请参阅 使用物化视图

通知

NOTIFICATION_HISTORY

有关更多信息,请参阅 使用 SYSTEM$SEND_EMAIL 发送电子邮件通知

SCIM 维护

REST_EVENT_HISTORY

有关更多信息,请参阅 审计 SCIM API 请求

搜索优化维护

SEARCH_OPTIMIZATION_HISTORY

有关更多信息,请参阅 搜索优化服务

SYSTEM$STREAM_BACKLOG

有关更多信息,请参阅 使用表流进行变更跟踪

任务

COMPLETE_TASK_GRAPHS

有关更多信息,请参阅 任务简介

CURRENT_TASK_GRAPHS

SERVERLESS_TASK_HISTORY

TASK_DEPENDENTS

TASK_HISTORY

网络规则

NETWORK_RULE_REFERENCES

Information Schema 表函数。有关详细信息,请参阅 网络规则

语法

SELECT ...
  FROM [ <input_table> [ [AS] <alias_1> ] ,
         [ LATERAL ]
       ]
       TABLE( <table_function>( [ <arg_1> [, ... ] ] ) ) [ [ AS ] <alias_2> ];
Copy

有关特定于函数的语法,请参阅各个系统定义表函数的文档。

使用说明

  • 表函数也可以使用 LATERAL 构造应用于一组行。

  • 为了支持使用表表达式,Snowflake 支持在查询和子查询的 FROM 子句中使用 ANSI/ISO 标准的表表达式语法。此语法用于指示表达式返回行的集合,而不是单行。

  • 此 ANSI/ISO 语法仅在 SELECT 列表的 FROM 子句中有效。在任何其他上下文中,都不能从集合子查询规范中省略这些关键字和括号。

语言: 中文