表函数

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

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

本主题内容:

什么是表函数?

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

每次调用表函数时,它都可以返回不同数量的行。例如,函数 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 提供了数百个内置函数,其中许多是表函数。内置表函数在 系统定义表函数 中列出。

Users can also write their own functions, called user-defined functions or "UDFs". Some UDFs are scalar; some are tabular. User-defined table functions are called "UDTFs". For information about UDFs (including UDTFs), see 用户定义的函数概述.

内置表函数和用户定义表函数通常遵循相同的规则;例如,它们的调用方式与 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

For more information about the syntax of TABLE(), see 表字面量.

表函数与一般函数一样,可以在每次调用中接受零个、一个或多个输入实参。每个实参必须是标量表达式。

For more details about the syntax of table function calls, see 语法 (in this topic).

使用表作为表函数的输入

表函数的实参可以是字面量或表达式,例如表的列。例如,下面的 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

For more information, see 将数据载入 Snowflake.

VALIDATE

数据生成

GENERATOR

数据转换

SPLIT_TO_TABLE

STRTOK_SPLIT_TO_TABLE

差分隐私

CUMULATIVE_PRIVACY_LOSSES

对象建模

GET_OBJECT_REFERENCES

参数化查询

TO_QUERY

半结构化查询

FLATTEN

For more information, see 查询半结构化数据.

查询结果

RESULT_SCAN

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

查询配置文件

GET_QUERY_OPERATOR_STATS

历史和使用信息

包括:

用户登录

LOGIN_HISTORY、LOGIN_HISTORY_BY_USER

查询

QUERY_HISTORY、QUERY_HISTORY_BY_*

QUERY_ACCELERATION_HISTORY

For more information, see Using the Query Acceleration Service (QAS).

仓库和存储使用情况

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_DANGLING_REFERENCES

For more information, see 跨多个账户的复制和故障转移简介

REPLICATION_GROUP_REFRESH_HISTORY、REPLICATION_GROUP_REFRESH_HISTORY_ALL

REPLICATION_GROUP_REFRESH_PROGRESS、REPLICATION_GROUP_REFRESH_PROGRESS_BY_JOB、REPLICATION_GROUP_REFRESH_PROGRESS_ALL

REPLICATION_GROUP_USAGE_HISTORY

警报

ALERT_HISTORY

For more information, see 根据 Snowflake 中的数据设置警报.

SERVERLESS_ALERT_HISTORY

绑定变量

BIND_VALUES

For more information, see Retrieve bind variable values.

数据库复制

DATABASE_REFRESH_HISTORY

For more information, see 跨多个账户复制数据库.

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

For more information, see 自动聚类.

动态表

DYNAMIC_TABLES

For more information, see 创建动态表.

DYNAMIC_TABLE_GRAPH_HISTORY

DYNAMIC_TABLE_REFRESH_HISTORY

External Functions

EXTERNAL_FUNCTIONS_HISTORY

For more information, see 编写外部函数.

外部表

AUTO_REFRESH_REGISTRATION_HISTORY

有关更多信息,请参阅 外部表简介

EXTERNAL_TABLE_FILES

EXTERNAL_TABLE_FILE_REGISTRATION_HISTORY

Iceberg 表

ICEBERG_TABLE_FILES

Information Schema 表函数。

ICEBERG_TABLE_SNAPSHOT_REFRESH_HISTORY

Information Schema 表函数。

列表

AVAILABLE_LISTING_REFRESH_HISTORY

LISTING_REFRESH_HISTORY

物化视图维护

MATERIALIZED_VIEW_REFRESH_HISTORY

For more information, see 使用物化视图.

通知

NOTIFICATION_HISTORY

For more information, see 使用 SYSTEM$SEND_EMAIL 发送电子邮件通知.

SCIM 维护

REST_EVENT_HISTORY

For more information, see 审计 SCIM API 请求

搜索优化维护

SEARCH_OPTIMIZATION_HISTORY

For more information, see 搜索优化服务.

SYSTEM$STREAM_BACKLOG

For more information, see Streams 简介.

任务

COMPLETE_TASK_GRAPHS

For more information, see 任务简介.

CURRENT_TASK_GRAPHS

SERVERLESS_TASK_HISTORY

TASK_DEPENDENTS

TASK_HISTORY

网络规则

NETWORK_RULE_REFERENCES

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

数据质量

DATA_METRIC_FUNCTION_EXPECTATIONS

DATA_METRIC_FUNCTION_REFERENCES

DATA_QUALITY_MONITORING_EXPECTATION_STATUS

DATA_QUALITY_MONITORING_RESULTS

SYSTEM$DATA_METRIC_SCAN

SYSTEM$EVALUATE_DATA_QUALITY_EXPECTATIONS

数据沿袭

GET_LINEAGE (SNOWFLAKE.CORE)

For more information, see 数据沿袭.

Cortex Search

CORTEX_SEARCH_DATA_SCAN

For more information, see Cortex Search.

联系人

GET_CONTACTS

Snowpark Container Services

GET_JOB_HISTORY

有关更多信息,请参阅 Snowpark Container Services:监控服务

<service_name>!SPCS_GET_EVENTS

<service_name>!SPCS_GET_LOGS

<service_name>!SPCS_GET_METRICS

Snowflake Native Apps

APPLICATION_SPECIFICATION_STATUS_HISTORY

For more information, see Overview of app specifications.

语法

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

For function-specific syntax, see the documentation for the individual system-defined table functions.

使用说明

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

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

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

语言: 中文