使用CASE和RETURNING的Postgres UPDATE返回所有行

时间:2018-09-24 14:05:52

标签: sql postgresql sql-update sql-returning

我在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 

我希望获得更新后的行的ID,例如[3,4,5],但它会返回所有行的ID

我的查询出了什么问题?

3 个答案:

答案 0 :(得分:4)

您正在更新所有行。

  • 当order_id为'7'时,您就是将Dealer_id设置为1。
  • 当order_id为'6'时,您会将Dealer_id设置为2。
  • 对于order_id的所有其他值,您要将Dealer_id设置为Dealer_id。 (这似乎很奇怪。)

我会在没有更多信息的情况下做出任何建议,但这可能更接近您想要的。

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 

答案 1 :(得分:1)

您没有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 ;

您可能会对this explanation感兴趣,为什么不包括WHERE子句时所有行都会受到影响。

答案 2 :(得分:0)

您可能缺少条件(过滤条件)。当前查询将匹配所有行,并尝试根据大小写表达式影响它们。