Snowflake-VALUES子句中的运算-无效的表达式

时间:2019-10-31 15:50:39

标签: snowflake-data-warehouse

如何在Snowflake的VALUES子句中获得有理数?

SELECT * FROM ( 
   VALUES (1/3.0), (2)
) AS  t ;

返回:

  

SQL编译错误:VALUES子句中的表达式[1/3]无效

2 个答案:

答案 0 :(得分:3)

这是如此奇特,可以描述为一个错误。
任何除以整数的除法都可以,但是分数会触发错误消息。

Documentation指出:
每个表达式必须是一个常量,或者是一个表达式,可以在编译SQL语句期间将其作为常量进行评估。 大多数简单的算术表达式和字符串函数可以在编译时求值,而其他大多数表达式则不能。

显然(1/3)应该是一个简单的算术表达式。简单的解决方法当然是计算答案并将其包含为十进制数字:

SELECT * FROM (VALUES (0.33333333333333333), (2)) AS T(VAL);

再三考虑,这并不像看起来那样简单。如果在CREATE TABLE AS SELECT语句中使用了这些值,那么数据类型应该是NUMBER(7,6)还是FLOAT还是其他?在这些情况下,最好是具体说明。

除法等的详细信息记录在Scale and Precision in Arithmetic Operations中。

答案 1 :(得分:1)

如果您知道自己有大量有理输入,则只需在选择中进行数学运算即可

SELECT column1/column2 FROM VALUES (1,3),(2,1);

给予:

COLUMN1/COLUMN2
0.333333
2.000000