Snowflake 在插入时是否存在 MD5 问题?

Does Snowflake have issues with MD5 on insert?

冒着错过一些明显的风险......

我正在向 table 中插入一条记录,其中有一个字符串用于保存校验和值。

我正在尝试插入这条记录:

插入 control_table(字段 1、字段 2、字段 3、字段 4、CHECKSUM_FIELD) 值 ('VALUE1', 'VALUE2', 'VALUE3', 'VALUE4', MD5('VALUE1VALUE2VALUE3VALUE4'));

Snowflake 不喜欢插页,告诉我:

SQL 编译错误:VALUES 子句中的表达式 [MD5('VALUE1VALUE2VALUE3VALUE4')] 无效。

我不确定为什么它不起作用,因为这个语句工作正常:

更新control_table 设置CHECKSUM_FIELD = MD5('VALUE1VALUE2VALUE3VALUE4') WHERE FIELD1 = 'VALUE1';

您的问题与在 INSERT 语句中使用 MD5 函数无关,而是与 VALUES 子句中的每个表达式必须

  • 常数,或
  • 在SQL 语句
  • 的编译过程中可以计算为常量的表达式

此行为记录在 Snowflake docs page

您的 INSERT 可以改写如下:

INSERT INTO control_table (field1, field2, field3, field4, CHECKSUM_FIELD)
SELECT , , , , MD5() FROM VALUES ('VALUE1', 'VALUE2', 'VALUE3', 'VALUE4', 'VALUE1VALUE2VALUE3VALUE4');

并且由于您似乎希望传递给 MD5() 的值是其他 4 个表达式的串联,因此您可以改用它:

INSERT INTO control_table (field1, field2, field3, field4, CHECKSUM_FIELD)
SELECT , , , , MD5(CONCAT(, , , )) FROM VALUES ('VALUE1', 'VALUE2', 'VALUE3', 'VALUE4');

但要小心简单地连接这样的表达式,因为 CONCAT(1,2,3,45) 将产生与 CONCAT(12,3,4,5) 相同的结果。通常,您可能希望在表达式之间插入定界符以避免此类问题。在那种情况下,这可能是更合适的方法:

INSERT INTO control_table (field1, field2, field3, field4, CHECKSUM_FIELD)
SELECT , , , , MD5(ARRAY_TO_STRING(ARRAY_CONSTRUCT(, , , ),':')) FROM VALUES ('VALUE1', 'VALUE2', 'VALUE3', 'VALUE4');