0

一連のフィルター(baseId、title、age、および発生日数)に基づいてDBからイベントをプルするクエリを作成しようとしています。

これが私がこれまでに得たものです:

SELECT * FROM [Events]
WHERE BaseId = 574 AND Title LIKE '%occurs%' AND MinAge <= 5 AND MaxAge >= 5 
AND (FreqType = 8 AND (FreqInterval & 2) = 2) 
OR (FreqType = 8 AND (FreqInterval & 4) = 4)

OR線がない場合は、問題なく引っ張られます。OR行を使用すると、BaseId、Title、MinAge、およびMaxAge列を気にしなくなります。ええと、そうですが、ORが...になるまでだけです。そして、ORの後に一致するものをすべてプルします(前のANDステートメントに関係なく)。

クエリを取得して各列でフィルタリングし、次に必要な各FreqIntervalでフィルタリングするにはどうすればよいですか?私は2、4だけではないかもしれません... 1、2、4、8、16、32、または64の任意の組み合わせを持つことができます。

または、AND (FreqType = 8 AND (FreqInterval & 6) = 6)FreqIntervalのSUMを使用してを実行する方法はありますか?ビット単位のクエリを完全には理解していません。

4

4 に答える 4

3

括弧を追加します。

SELECT * FROM [Events]
WHERE BaseId = 574 AND Title LIKE '%occurs%' AND MinAge <= 5 AND MaxAge >= 5 
AND 
(
   (FreqType = 8 AND (FreqInterval & 2) = 2) 
   OR (FreqType = 8 AND (FreqInterval & 4) = 4) 
)

ORはANDよりも演算子の優先順位が低いため、括弧で囲む必要があります。あなたはそれをさらに単純化することができます:

   (FreqType = 8 
       AND ( (FreqInterval & 2) = 2 OR (FreqInterval & 4) = 4) )
   )

そしてあなたの提案として、それはほとんど正しいです、しかしここに正しいものがあります:

 (FreqType = 8 
       AND (FreqInterval & 6) <> 0 )

ちなみに、演算子の優先順位の別の用語は演算子の粘着性です。元のクエリを明示的に記述する場合は、次のようになります。

SELECT * FROM [Events]
WHERE 
( 
  BaseId = 574 AND Title LIKE '%occurs%' AND MinAge <= 5 AND MaxAge >= 5 
  AND (FreqType = 8 AND (FreqInterval & 2) = 2) 
)

OR 

(FreqType = 8 AND (FreqInterval & 4) = 4)

これは、に似てい4 * 3 + 5ます。乗算は加算よりも優先順位が高いため、3は5ではなく4に固定されるため、出力はになり17ます。出力することが目的32の場合は、明示的に3から5に固定し、3と5の周りに括弧を付けます。4 * (3 + 5)

したがって、ORを使用するクエリでは、それらをくっつけるために、それらを括弧で囲みます。

それでも、あなたがほのめかしたように、私はこのより良いツが好きです</ p>

 (FreqType = 8 AND (FreqInterval & 6) <> 0 )
于 2012-04-19T13:22:50.447 に答える
2

これはビット単位の論理とは何の関係もありません。WHERE括弧を使用して2つのビット単位の比較を同じ評価セットの一部にするために、句を修正する必要があります。

...
AND (FreqType = 8 AND (FreqInterval & 2) = 2 OR 
                       FreqInterval & 4) = 4))

また、2回チェックする必要がないので、FreqTypeそのビットを簡略化しました。

OR以前の基準は無視できることを意味します。これを他のビット単位のチェックとともに括弧に入れると、そのうちの1つがtrueを返さなければならないことを意味します。

于 2012-04-19T13:14:30.703 に答える
2

それは優先事項だと思います。あなたはやっている:

BaseId = 574 AND Title LIKE '%occurs%' AND MinAge <= 5 AND MaxAge >= 5 AND (FreqType = 8 AND (FreqInterval & 2) = 2) 
OR
(FreqType = 8 AND (FreqInterval & 4) = 4)

追加してみてください()

WHERE BaseId = 574 AND Title LIKE '%occurs%' AND MinAge <= 5 AND MaxAge >= 5 
AND ((FreqType = 8 AND (FreqInterval & 2) = 2) OR (FreqType = 8 AND (FreqInterval & 4) = 4))
于 2012-04-19T13:15:02.577 に答える
1
SELECT * FROM [Events]
WHERE BaseId = 574 AND Title LIKE '%occurs%' AND MinAge <= 5 AND MaxAge >= 5 
AND ((FreqType = 8 AND (FreqInterval & 2) = 2) 
OR (FreqType = 8 AND (FreqInterval & 4) = 4))
于 2012-04-19T13:16:16.167 に答える