Есть ли у Snowflake проблемы с MD5 при вставке? - PullRequest
0 голосов
/ 14 октября 2019

Риск того, что я что-то упустил очевидное ......

Я вставляю запись в таблицу, в которой есть STRING, используемая для хранения значения контрольной суммы.

Я пытаюсь вставить эту запись:

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

Снежинка не любит вставку и говорит:

Ошибка компиляции SQL: Неверное выражение [MD5 ('VALUE1VALUE2VALUE3VALUE4')] в предложении VALUES.

Я не уверен, почему это не работает, потому что это утверждение работает нормально:

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

1 Ответ

2 голосов
/ 14 октября 2019

Ваша проблема связана не с использованием функции MD5 в операторе INSERT, а с тем, что каждое выражение в предложении VALUES должно быть

  • константой, ИЛИ
  • выражение, которое может быть оценено как константа во время компиляции оператора SQL

Это поведение описано на этой странице Документов о снежинках

Ваша 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');
...