我正在尝试使用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
,因此不会更新。如何将他们需要一起满足的最后条件分组?
答案 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 Operators,Comparison Operators和Operator Precedence。
如果points
已经 15,那么添加另一个谓词以避免空更新是值得的:
AND points IS DISTINCT FROM 15
或者,排除了NULL值:
AND points <> 15
详细说明: