类别:

查询语法

VALUES

在 SELECT 语句中,FROM 子句的 VALUES 分子句允许指定一组常量来形成有限的行集。

有关 INSERT 语句中 VALUES 子句的信息,请参阅 INSERT 语句的文档。

语法

SELECT ...
FROM ( VALUES ( <expr> [ , <expr> [ , ... ] ] ) [ , ( ... ) ] )
  [ [ AS ] <table_alias> [ ( <column_alias> [ , ... ] ) ] ]
[ ... ]

参数

expr

每个表达式必须是常量,或者是在 SQL 语句编译期间可以计算为常量的表达式。

大多数简单的算术表达式和字符串函数都可以在编译时计算,但大多数其他表达式不能。

table_alias

可选别名,用于为行集命名,就好像行集是一个表一样。

column_alias

可选的列别名,可指定列名称。

使用说明

  • FROM 子句中,VALUES 子句不能包含 DEFAULT 关键字。这与 INSERT 语句中的 VALUES 子句相反,后者支持使用 DEFAULT;例如 INSERT INTO table VALUES (10, DEFAULT, 'Name') ...

  • 如果 VALUES 子句包含同一列的多个不同数据类型的值,则 Snowflake 会确定一个可以包含所有值的通用数据类型,并将每个值隐式转换为该通用类型。如果您没有意识到,这种转换可能会产生意外的结果或错误。

    为避免意外强制转换,请显式将每个值 CAST 为所需的类型,将值分成多个 SQL 语句,或确保列中的所有值共享相同的类型。

    数字示例

    当同一列中的数值在小数位数或精度方面存在显着差异时,Snowflake 可能会返回 out of range 错误,因为值不适合确定的通用数值类型。

    SELECT column1 FROM VALUES
      (3.469446951953614e-18),
      (115898.73);
    
    100039 (22003): Numeric value '115898.73' is out of range
    

    特别是对于数值,您还可以将值指定为放在引号中的文本字符串,然后根据需要将其转换为数值。

    时间戳示例

    当不同类型的时间戳值出现在同一列中时,Snowflake 会将所有值转换为通用时间戳类型。在以下示例中,TIMESTAMP_NTZ 值被强制转换为 TIMESTAMP_LTZ:

    SELECT $1 AS a, SYSTEM$TYPEOF(a) FROM VALUES
      (TO_TIMESTAMP_LTZ('2025-03-24 01:37:00 -0700')),
      (TO_TIMESTAMP_NTZ('2025-03-24 08:37:00'));
    
    +-------------------------------+------------------+
    | A                             | SYSTEM$TYPEOF(A) |
    |-------------------------------+------------------|
    | 2025-03-24 01:37:00.000 -0700 | TIMESTAMP_LTZ(9) |
    | 2025-03-24 08:37:00.000 -0700 | TIMESTAMP_LTZ(9) |
    +-------------------------------+------------------+
    
  • VALUES 子句限制为 200,000 行。

示例

以下示例使用 VALUES 子句生成一组固定的已知行:

SELECT * FROM (VALUES (1, 'one'), (2, 'two'), (3, 'three'));
+---------+---------+
| COLUMN1 | COLUMN2 |
|---------+---------|
|       1 | one     |
|       2 | two     |
|       3 | three   |
+---------+---------+

您可以通过列名称(隐式)或列位置来引用值。以下示例按列位置引用第二列:

SELECT column1, $2 FROM (VALUES (1, 'one'), (2, 'two'), (3, 'three'));
+---------+-------+
| COLUMN1 | $2    |
|---------+-------|
|       1 | one   |
|       2 | two   |
|       3 | three |
+---------+-------+

以下示例使用别名区分多个 VALUES 子句:

SELECT v1.$2, v2.$2
  FROM (VALUES (1, 'one'), (2, 'two')) AS v1
        INNER JOIN (VALUES (1, 'One'), (3, 'three')) AS v2
  WHERE v2.$1 = v1.$1;

您还可以为列名指定别名,如以下示例所示:

SELECT c1, c2
  FROM (VALUES (1, 'one'), (2, 'two')) AS v1 (c1, c2);