2015-02-09 66 views
0

我试图使用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

您记录测试失败'scoreT2!= 0'。当然它没有修改。 – 2015-02-09 22:39:53

+0

*总是*包含确切的表定义与这样的问题。 – 2015-02-10 00:27:03

回答

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 

详情:

0

从你的描述你想要

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

在逻辑上是

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

当你下班NOT运算符到化合物相比你翻转AND s到OR S和反之亦然。