Snowflake - VALUES 子句中的操作 - 无效表达式
Snowflake - Operation in VALUES clause - Invalid expression
我们如何在 Snowflake 的 VALUES 子句中得到有理数?
SELECT * FROM (
VALUES (1/3.0), (2)
) AS t ;
returns :
SQL compilation error: Invalid expression [1 / 3] in VALUES clause
这太奇特了,可以定性为错误。
任何结果为整数的除法都有效,但分数会触发错误消息。
Documentation 指出:
每个表达式必须是一个常量,或者是一个 表达式,可以在 SQL 语句的编译过程中被计算为常量 。
大多数简单的算术表达式和字符串函数可以在编译时求值,但大多数其他表达式不能。
显然(1/3)
应该是这么简单的算术表达式。简单的解决方法当然是计算答案并将其包含为十进制数:
SELECT * FROM (VALUES (0.33333333333333333), (2)) AS T(VAL);
转念一想,这并不像看起来那么简单。如果在 CREATE TABLE AS SELECT
语句中使用这些值,数据类型应该是 NUMBER(7,6)
还是 FLOAT
或其他类型?也许最好在这些情况下具体说明。
如果你知道你有大量你想要的理性输入,你可以在 select
中做数学运算
SELECT column1/column2 FROM VALUES (1,3),(2,1);
给予:
COLUMN1/COLUMN2
0.333333
2.000000
我们如何在 Snowflake 的 VALUES 子句中得到有理数?
SELECT * FROM (
VALUES (1/3.0), (2)
) AS t ;
returns :
SQL compilation error: Invalid expression [1 / 3] in VALUES clause
这太奇特了,可以定性为错误。
任何结果为整数的除法都有效,但分数会触发错误消息。
Documentation 指出:
每个表达式必须是一个常量,或者是一个 表达式,可以在 SQL 语句的编译过程中被计算为常量 。
大多数简单的算术表达式和字符串函数可以在编译时求值,但大多数其他表达式不能。
显然(1/3)
应该是这么简单的算术表达式。简单的解决方法当然是计算答案并将其包含为十进制数:
SELECT * FROM (VALUES (0.33333333333333333), (2)) AS T(VAL);
转念一想,这并不像看起来那么简单。如果在 CREATE TABLE AS SELECT
语句中使用这些值,数据类型应该是 NUMBER(7,6)
还是 FLOAT
或其他类型?也许最好在这些情况下具体说明。
如果你知道你有大量你想要的理性输入,你可以在 select
中做数学运算SELECT column1/column2 FROM VALUES (1,3),(2,1);
给予:
COLUMN1/COLUMN2
0.333333
2.000000