Как обновить несколько строк, сохранив одни и те же значения столбцов, а другие обновив? - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь массово обновить некоторые строки в postgres. Теперь не все строки должны обновлять одинаковые значения столбцов. Например, строка 1 должна обновлять столбцы 1 и 3, тогда как строка 2 должна обновлять столбцы 2 и 4. поэтому строки 1 и 2 столбца не должны изменяться, а строки 1 и 3 столбца 2 не должны изменяться.

Я попытался использовать CASE s для условного SET правильного значения столбца, но он не работает с несколькими строками. Это работает, если я пытаюсь обновить только 1 строку за раз.

update topic as tmp set 
"from" = (CASE WHEN tmp2."from2"::text = 'OLD_VALUE' THEN tmp."from"::int2 ELSE tmp2."from2"::int2 end),
"text_search" = (CASE WHEN tmp2."text_search2"::text = 'OLD_VALUE' THEN tmp."text_search"::text ELSE tmp2."text_search2"::text end),
"weight" = (CASE WHEN tmp2."weight2"::text = 'OLD_VALUE' THEN tmp."weight"::numeric ELSE tmp2."weight2"::numeric end)
from (values 
(1051,1,'Electronic Devices',3),
(1052,'OLD_VALUE','OLD_VALUE',100)
)  as tmp2("id2","from2","text_search2","weight2")  
where  tmp2."id2" = tmp."id"

Это сообщение об ошибке, которое я получаю

Ошибка SQL [22P02]: ОШИБКА: неверный синтаксис ввода для типацелое число: "OLD_VALUE"

Когда я пытаюсь использовать только 1 FROM значение

from (values (1051,1,'Electronic Devices',3))

или

from (values (1052,'OLD_VALUE','OLD_VALUE',100))

, оно работает правильно.

Он даже работает правильно, если требуется обновить одни и те же столбцы, например.

from (values 
(1051,1,'Electronic Devices',3),
(1052,2,'Topic 2',100)
)

Почему он не работает правильно, когда мне нужно обновить разные столбцы для каждой строки?

1 Ответ

1 голос
/ 18 октября 2019

Когда вы предоставляете список значений как values (1051,1,'Electronic Devices',3),(1052,'OLD_VALUE','OLD_VALUE',100)), первый набор значений интерпретируется как «шаблон» типов данных, и в этом случае (1051,1,'Electronic Devices',3), это int, int, text, int. Затем ожидается, что любые последующие значения будут иметь одинаковую сигнатуру типа данных. Когда он анализирует (1052,'OLD_VALUE','OLD_VALUE',100), он видит int,text,text,int, что не соответствует ожидаемой подписи типа данных, поэтому он сообщает об ошибке.

Когда вы опускаете первое значение и предоставляете только (1052,'OLD_VALUE','OLD_VALUE',100),затем он идентифицирует int,text,text,int как сигнатуру типа «шаблон» и работает без жалоб.

...