条件输入值和没有PostgreSQL

时间:2018-06-07 08:14:45

标签: sql postgresql

UPDATE backend."orders"
  SET "statusId" = 5
WHERE "orderId" IN  (10697457,10697458)
  and "statusId" IN (0,1,2,3,4);

UPDATE backend."orders"
   SET "statusId" = 5
WHERE "orderId" IN  (VALUES (10697457),(10697458))
  and "statusId" IN (VALUES (0),(1),(2),(3),(4));

这两个查询之间有什么区别?

2 个答案:

答案 0 :(得分:1)

这两个查询给出了相同的结果。不同之处在于可读性和效率。

the doc中所述,IN运算符必须后跟:

  

带括号的标量表达式列表。如果是,结果是“真实的”   左手表达式的结果等于任何右手   表达式

通过使用关键字VALUES,您仍然可以创建一个标量表达式列表,因此它是正确的,但它更重,the documentation (see the end of the page)不推荐它:

  

提示:对于简单的IN测试,最好依赖于标量列表   IN的形式比写如上所示的VALUES查询。清单   标量方法需要较少的写作,并且通常更有效。

它可能会对性能产生影响(如引言所示),因为在有和没有VALUES的情况下,标量列表的创建可能会有所不同,但我不知道,有人必须确认。

答案 1 :(得分:0)

两个版本都是正确的,但依赖于IN的标量列表形式比编写VALUES查询更好。 IN方法的标量列表需要较少的写入,并且通常更有效。