【问题标题】:Does Snowflake have issues with MD5 on insert?Snowflake 在插入时是否存在 MD5 问题?
【发布时间】:2020-02-11 06:34:17
【问题描述】:

冒着遗漏一些明显的东西的风险......

我正在向一个表中插入一条记录,该表有一个用于保存校验和值的 STRING。

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

INSERT INTO control_table (field1, field2, field3, field4, CHECKSUM_FIELD) 值('VALUE1'、'VALUE2'、'VALUE3'、'VALUE4'、MD5('VALUE1VALUE2VALUE3VALUE4'));

Snowflake 不喜欢插入,告诉我:

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

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

UPDATE control_table SET CHECKSUM_FIELD = MD5('VALUE1VALUE2VALUE3VALUE4') WHERE FIELD1 = 'VALUE1';

【问题讨论】:

  • 作为仅供参考,如果我将 VALUES 更改为 SELECT,则插入有效: INSERT INTO control_table (field1, field2, field3, field4, CHECKSUM_FIELD) SELECT 'VALUE1', 'VALUE2', 'VALUE3' , 'VALUE4', MD5('VALUE1VALUE2VALUE3VALUE4');

标签: md5 snowflake-cloud-data-platform


【解决方案1】:

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

  • 一个常数,或
  • 在 SQL 语句编译期间可作为常量计算的表达式

此行为记录在此Snowflake docs page

您的 INSERT 可以改写如下:

INSERT INTO control_table (field1, field2, field3, field4, CHECKSUM_FIELD)
SELECT $1, $2, $3, $4, MD5($5) FROM VALUES ('VALUE1', 'VALUE2', 'VALUE3', 'VALUE4', 'VALUE1VALUE2VALUE3VALUE4');

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

INSERT INTO control_table (field1, field2, field3, field4, CHECKSUM_FIELD)
SELECT $1, $2, $3, $4, MD5(CONCAT($1, $2, $3, $4)) 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 $1, $2, $3, $4, MD5(ARRAY_TO_STRING(ARRAY_CONSTRUCT($1, $2, $3, $4),':')) FROM VALUES ('VALUE1', 'VALUE2', 'VALUE3', 'VALUE4');

【讨论】:

  • 谢谢,达伦,正是我要找的东西
猜你喜欢
  • 2014-01-19
  • 1970-01-01
  • 2016-10-01
  • 2020-12-12
  • 1970-01-01
  • 1970-01-01
  • 2014-02-03
  • 1970-01-01
相关资源
最近更新 更多