5

我的 sql 查询中有这一行:

WHERE client = $id
    AND (isinvoiced = 0) OR (isinvoiced = 1 and isrecurring = 1)

得到的结果比我预期的要多。但是,如果我这样写:

WHERE client = $id
    AND (isinvoiced = 0) OR (isinvoiced = 1 and isrecurring = 1 and client = $id)

然后它得到了我想要的结果,但这是写这个的最好方法吗?我只是不想再遇到此代码的任何问题。

4

6 回答 6

8

您需要()在整个AND子句周围再设置一组。这表明client = $id必须为真,其他任何一个条件也必须为真 =isinvoiced = 0或 的组合isinvoiced = 1 and isrecurring = 1

 WHERE client = $id
    AND ((isinvoiced = 0) OR (isinvoiced = 1 and isrecurring = 1))
于 2012-04-23T15:26:12.197 回答
2

AND在您的子句周围添加一个括号:

WHERE client = $id
    AND ((isinvoiced = 0) OR (isinvoiced = 1 and isrecurring = 1))
于 2012-04-23T15:27:12.127 回答
1
where client = $id
    and (
        isinvoiced = 0
        or (
            isinvoiced = 1
            and isrecurring = 1
            )
        )
于 2012-04-23T15:26:54.277 回答
1

你想要的是这样的:

WHERE client = $id AND ((isinvoiced = 0) OR (isinvoiced = 1 and isrecurring = 1))

如果您不放置额外的 blaquets,它将OR与客户限制并产生更多结果。

于 2012-04-23T15:27:18.207 回答
0

对于 SQL,您应该旨在以合取范式(“一系列AND子句”)编写搜索条件。有各种重写规则可以帮助实现这一点。

分配重写法则在这种情况下很有用,即

( P AND Q ) OR R   <=>   ( P OR R ) AND ( Q OR R )    

在你的情况下:

( isinvoiced = 0 ) OR ( isinvoiced = 1 AND isrecurring = 1 )

可以改写为:

( isinvoiced = 0 OR isinvoiced = 1 ) AND ( isinvoiced = 0 OR isrecurring = 1 )

因此,没有笨拙的括号的整个搜索条件:

....
WHERE client = $id
      AND ( isinvoiced = 0 OR isinvoiced = 1 ) 
      AND ( isinvoiced = 0 OR isrecurring = 1 );
于 2012-04-24T08:28:15.630 回答
-1

如果删除最初的 where 子句

remove -> WHERE client = $id

并且只有

 WHERE (isinvoiced = 0) OR (isinvoiced = 1 and isrecurring = 1 and client = $id)

这会让你得到你想要的结果吗?

于 2012-04-23T15:27:12.037 回答