Я вижу поведение, которое не могу объяснить при использовании COALESCE в предложении INNER JOIN в инструкции UPDATE. Аналогичный оператор SELECT работает.
MySQL v5.7.27. (Мне нужно остаться на 5.7.x для совместимости AWS Aurora MySQL.)
Схема и данные:
CREATE TABLE S1( id bigint not null,
displayName varchar(255) not null collate utf8_general_ci );
CREATE TABLE PI( S1_id bigint null,
col1 varchar(255) null collate utf8_general_ci,
col2 varchar(255) null collate utf8_general_ci);
INSERT INTO S1 (id, displayName)
VALUES( 1, 'test');
INSERT INTO PI (S1_id, col1, col2)
VALUES( null, null, 'test' );
Рабочий запрос выбора:
select S1.id, S1.displayName, COALESCE( PI.col1, PI.col2)
FROM PI
INNER JOIN S1
ON S1.displayName = COALESCE(PI.col1, PI.col2) collate utf8_unicode_ci;
возвращает 1 строку:
id displayName COALESCE( PI.col1, PI.col2)
1 test test
Я ожидаю, что этот оператор обновления обновит 1 строку:
UPDATE PI
INNER JOIN S1
ON COALESCE( PI.col1, PI.col2 ) collate utf8_unicode_ci = S1.displayName
SET PI.S1_id = S1.id;
Expected: 1 row updated in PI, S1_id = 1
Actual: 0 rows updated
Для ухмылок я также удалил COLLATE, поскольку это технически не требуется:
UPDATE PI
INNER JOIN S1 ON COALESCE( PI.col1, PI.col2 ) = S1.displayName
SET PI.S1_id = S1.id;
Expected: 1 row updated in PI, S1_id = 1
Actual: 0 rows updated
и также поменял предложение ON:
UPDATE PI
INNER JOIN S1 ON S1.displayName = COALESCE( PI.col1, PI.col2 )
SET PI.S1_id = S1.id;
Expected: 1 row updated in PI, S1_id = 1
Actual: 0 rows updated
Я могу обойти это, добавив столбец в PI и предварительно вычислив значение COALESCE, но я чрезвычайно Любопытно, что происходит!
Заранее спасибо!