- 类别:
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 可能会返回
out of range
错误。即使每个单独的值不会导致目标列的数据类型出现错误,也可能会返回错误。之所以发生错误,是因为 Snowflake 确定了一种常见的数字数据类型,该数据类型可以包含 VALUES 子句中提供的所有数字字面量,并且某些值可能超出所确定的通用数据类型的范围。
例如,以下语句会返回
out of range
错误:SELECT column1 FROM VALUES (3.469446951953614e-18), (115898.73);
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'));
+---------+---------+
| 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);