Postgres UPDATE, используя CASE с RETURNING, возвращает все строки - PullRequest
0 голосов
/ 24 сентября 2018

Я выполняю следующий запрос в postgres:

 UPDATE products SET dealer_id = 
                        CASE
                             WHEN order_id = 7 THEN '1' 
                             WHEN order_id = 6 THEN '2' 
                             ELSE dealer_id
                        END 
                        RETURNING id 

Ожидаю получить идентификаторы обновленных строк, например [3,4,5], но он возвращает идентификаторы всех строк

чтоне так с моим запросом?

Ответы [ 3 ]

0 голосов
/ 24 сентября 2018

У вас нет предложения where, поэтому вы обновляете все строки.

Я думаю, вы намереваетесь:

 UPDATE products
    SET dealer_id = (CASE WHEN order_id = 7 THEN '1' 
                          WHEN order_id = 6 THEN '2' 
                          ELSE dealer_id
                     END)
    WHERE order_id IN (6, 7)
    RETURNING id ;

Возможно, вас заинтересует это объяснение почему все строки затронуты, если вы не включите предложение WHERE.

0 голосов
/ 24 сентября 2018

Вы обновляете все строки.

  • Когда для order_id установлено значение «7», вы устанавливаете автопоказ_дилера в значение 1.
  • Когда для параметра order_id установлено значение «6», значение дилера_идентификатора устанавливается в значение 2.

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

UPDATE products 
SET dealer_id = CASE
                    WHEN order_id = 7 THEN '1' 
                    WHEN order_id = 6 THEN '2' 
                END 
WHERE order_id in (7, 6)
RETURNING id 
0 голосов
/ 24 сентября 2018

Вы можете отсутствовать там, где условие (критерии фильтрации).Текущий запрос сопоставит все строки и попытается повлиять на них на основе выражения регистра.

...