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

()全体の周りにもう1セット必要です。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 に答える