Вы пытаетесь присвоить полю в столбце 1 каждой строки два разных значения одновременно.Это действительно не имеет никакого логического смысла и может привести к неожиданному или нежелательному поведению.Неясно, что
Из быстрого теста я бы предположил, что вероятным результатом будет то, что если column2
содержит "foo"
или "bar"
, то конечное значение, которое заканчивается в column1
, будет NULL
(т.е. NULL
, сгенерированный вторым оператором CASE).Кажется, что SQL будет оценивать первый оператор CASE, а затем второй оператор CASE.Поэтому значение, возвращаемое вторым оператором, перезаписывает значение в поле с результатом этого оператора вместо первого.Фактически это означает, что первый оператор CASE бесполезен.
Вот рабочая демонстрация этого теста: https://db -fiddle.com / f / foYWchffxkFkxtQuuRsDgC / 1
ИВот небольшая настройка с заменой выходных значений NULL различными значениями, поэтому вы можете точно увидеть, каково поведение и какое предложение генерирует окончательное значение: https://db -fiddle.com / f / foYWchffxkFkxtQuuRsDgC / 2 ,
Но неважно, является ли это случайностью или фактически определенным / задокументированным поведением в таком сценарии.Это мое повторяемое наблюдение, вот и все.
В любом случае, вам действительно нужно изменить свой код, вы не можете придерживаться этой ненадежной версии.
Кажется, вы уже знаете ответ, но для ясности вот надежная версия, которая пытается установить значение столбца только один раз:
UPDATE mytable
SET column1 = CASE
WHEN column2 = 'a' THEN 'foo'
WHEN column2 = 'b' THEN 'bar'
WHEN column2 = 'c' THEN 'foobar'
WHEN column2 = 'd' THEN 'barbar'
ELSE null
END
WHERE key = ...