Можно ли повторить тот же столбец в выражении UPDATE? - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть оператор обновления, где каждая часть генерируется отдельно.Идеальная ситуация - создать следующее:

UPDATE mytable
   SET column1 = CASE WHEN ... THEN ... WHEN ... THEN ... WHEN ... THEN ... WHEN ... THEN ... ELSE ... END
       ...
 WHERE ...

Однако я должен обойтись этим:

UPDATE mytable
   SET column1 = CASE WHEN ... THEN ... WHEN ... THEN ... ELSE ... END,
       column1 = CASE WHEN ... THEN ... WHEN ... THEN ... ELSE ... END
       ...
 WHERE ...

Я попытался запустить его, и он работает.

Я хотел бы знать, есть ли какие-нибудь ошибки или что-то еще, если бы я действительно придерживался этого.

ОБНОВЛЕНИЕ: WHEN ... THEN фактически содержит связанные со столбцами условия.например, КОГДА column2 = ... THEN ...

Например,

UPDATE mytable 
  SET column1 = CASE 
        WHEN column2 = 'a' THEN 'foo' 
        WHEN column2 = 'b' THEN 'bar' 
        ELSE null 
      END, 
      column1 = CASE 
        WHEN column2 = 'c' THEN 'foobar' 
        WHEN column2 = 'd' THEN 'barbar' 
        ELSE null 
      END 
WHERE key = ...

1 Ответ

0 голосов
/ 29 ноября 2018

Вы пытаетесь присвоить полю в столбце 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 = ...
...