括号中的条件分组不起作用

时间:2015-02-09 22:36:46

标签: sql postgresql boolean-logic operator-precedence

我正在尝试使用Postgres中的SQL查询,如下所示:

UPDATE gamebet 
SET points = 15 
WHERE game = 8 
  AND "scoreT1" > "scoreT2" 
  AND "scoreT1" - "scoreT2" != 1 
  AND ("scoreT1" != 1 AND "scoreT2" != 0)

它应该更新scoreT1大于scoreT2的一些投注的分数,但是有些行不应该更新。这就是当scoreT1 - scoreT2 = 1并且如果scoreT1 = 1和scoreT2 = 0,但它应该仅在满足这两个条件时应用。不知何故,括号不适用。从例如此记录未被修改:

scoreT1 = 3
scoreT2 = 0

此记录应该更新,但由于其中一个条件是scoreT2 != 0,因此不会更新。如何将他们需要一起满足的最后条件分组?

2 个答案:

答案 0 :(得分:0)

根据您的描述

 NOT("scoreT1" - "scoreT2" == 1 OR ("scoreT1" == 1 AND "scoreT2" == 0))

逻辑上是

 "scoreT1" - "scoreT2" != 1 AND ("scoreT1" != 1 OR "scoreT2" != 0)

当您将NOT运算符转换为复合比较时,您将AND转换为OR s,反之亦然。

答案 1 :(得分:0)

只要不排除NULL值,您的描述必须翻译成以下内容:

UPDATE gamebet 
SET    points = 15 
WHERE  game = 8 
AND   "scoreT1" > "scoreT2" 
AND  ("scoreT1" = "scoreT2" + 1 AND "scoreT1" = 1) IS NOT TRUE;

附加条件"scoreT2" = 0逻辑上来自前两个,并且是多余的。

如果"scoreT1""scoreT2"定义为 NOT NULL ,您可以进一步简化:

...
AND   NOT ("scoreT1" = "scoreT2" + 1 AND "scoreT1" = 1)

或使用倒置逻辑:

...
AND   ("scoreT1" <> "scoreT2" + 1 OR "scoreT1" <> 1)

阅读手册中的Logical OperatorsComparison OperatorsOperator Precedence

如果points已经 15,那么添加另一个谓词以避免空更新是值得的:

AND points IS DISTINCT FROM 15

或者,排除了NULL值:

AND points <> 15

详细说明: