类别:

查询语法

VALUES

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

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

语法

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

参数

expr

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

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

table_alias

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

column_alias

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

使用说明

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

  • 当 VALUES 子句包含同一列的多个数值,并且这些值的小数位数或精度有显著差异时,Snowflake 可能会返回 out of range 错误。即使每个单独的值不会导致目标列的数据类型出现错误,也可能会返回错误。

    之所以发生错误,是因为 Snowflake 确定了一种常见的数字数据类型,该数据类型可以包含 VALUES 子句中提供的所有数字字面量,并且某些值可能超出所确定的通用数据类型的范围。

    例如,以下语句会返回 out of range 错误:

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

    您可以通过进行以下更改来避免此类错误:

    • 将 VALUES 子句中的值分成多个 SQL 语句。

    • 将值转换为具有更大范围值的数据类型,例如 FLOAT。但是,类型转换可能会导致数字精度降低。

    • 将值指定为放在引号中的文本字符串,然后根据需要将值转换为数值。

  • VALUES 子句限制为 16,384 行。

示例

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

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

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

SELECT column1, $2 FROM (VALUES (1, 'one'), (2, 'two'), (3, 'three'));
Copy
+---------+-------+
| 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;
Copy

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

SELECT c1, c2
  FROM (VALUES (1, 'one'), (2, 'two')) AS v1 (c1, c2);
Copy
语言: 中文