Как обновить несколько элементов по идентификатору?

#sql #postgresql #case

#sql #postgresql #случай

Вопрос:

Я пытаюсь обновить несколько ячеек, но ничего, не могли бы вы помочь мне оптимизировать мой запрос?

 with upd AS (
UPDATE era 
SET gender = CASE id
    WHEN 3 THEN 'Female'
    WHEN 4 THEN 'Male'
END,
SET city = CASE id
    WHEN 3 THEN 'Minsk'
    WHEN 4 THEN 'Brest'
END
WHERE id IN (3, 4)
returning *
)
select * from upd;
  

Ответ №1:

Я бы посоветовал вам использовать производную таблицу для этой логики:

 WITH upd AS (
      UPDATE era 
          SET gender = v.gender,
              city = v.city
          FROM (VALUES (3, 'Female', 'Minsk'), (4, 'Male', 'Brest')
               ) v(id, gender, city)
          WHERE v.id = era.id
          RETURNING *
    )
SELECT * 
FROM upd;
  

Используя этот метод, вам не нужно повторять значения или использовать сложные CASE выражения — оба из которых подвержены ошибкам.

Ответ №2:

Вам просто не нужен второй SET

 with upd AS (
    UPDATE era 
    SET gender = CASE id
        WHEN 3 THEN 'Female'
        WHEN 4 THEN 'Male'
    END,
    city = CASE id
        WHEN 3 THEN 'Minsk'
        WHEN 4 THEN 'Brest'
    END
    WHERE id IN (3, 4)
    returning *
)
select * from upd;