2

MySQLv5.5.27を使用しています。私は通常、このSELECTステートメントを次のように記述します。

SELECT DISTINCT * 
FROM table 
WHERE something = 'this' 
    OR something = 'that' 
    OR something = 'other' 
    AND thingamajig = 'one' 
    OR thingamajig = 'two'

しかし、このSELECTステートメントはまったく同じ結果を提供しますか?

SELECT DISTINCT * 
FROM table 
WHERE something = ('this' OR 'that' OR 'other') 
    AND thingamajig = ('one' OR 'two')

これを実行してみましたが、機能しているようです。この2番目の方法で、私が考えられないような方法で誤ったデータが返されないようにしたいだけです。

洞察、支援をありがとう!

4

4 に答える 4

6

検索条件の順序を明確にグループ化するために、括弧を使用することをお勧めします。

あなたの 2 番目のSELECTステートメントは、最初のステートメントよりもはるかに明確です。

SELECT DISTINCT * 
FROM table 
WHERE something = ('this' OR 'that' OR 'other') 
AND thingamajig = ('one' OR 'two')

IN複数の値がある場合にも演算子を使用できることを覚えておいてください。

SELECT DISTINCT * 
FROM table 
WHERE something IN ('this', 'that', 'other') 
AND thingamajig IN ('one', 'two')

さらに、IN演算子を使用すると、 を使用するよりもはるかに高速に実行さORれます。

于 2012-09-26T15:10:21.607 に答える
4

AND SQL よりも優先ORれます。これは、最初のクエリがこれに相当することを意味します。

SELECT DISTINCT * 
FROM table 
WHERE something = 'this' 
    OR something = 'that' 
    OR (something = 'other' AND thingamajig = 'one') 
    OR thingamajig = 'two' 

これは明らかに 2 番目のクエリと同じ結果ではなく、意図した動作ではない可能性があります。

この場合、 を使用INして問題を解決することができますが、一般に、さまざまな AND および OR の組み合わせの結果を把握できるように、演算子の優先順位を理解することをお勧めします。

したがって、明確にするために、最初のクエリを次のように書き直すことができます。

SELECT DISTINCT *     
FROM table     
WHERE (something = 'this'         
        OR something = 'that'         
        OR something = 'other')         
    AND (thingamajig = 'one'         
        OR thingamajig = 'two')

それを use ステートメントに変換するかどうかはIN、出力に影響を与えず、おそらくパフォーマンスにも影響を与えないため、何よりもコーディング スタイルとエレガンスの問題です。

于 2012-09-26T15:11:41.143 に答える
2

INの代わりに使用し=ます。

SELECT DISTINCT * 
FROM table 
WHERE something IN ('this', 'that', 'other') AND 
      thingamajig IN ('one', 'two')

INに似てORいるため、パフォーマンスは同じです。2 番目のクエリで構文エラーが発生します。のみが句commaで許可されているためです。IN

SELECT DISTINCT * 
FROM table 
WHERE something = ('this' OR 'that' OR 'other') 
    AND thingamajig = ('one' OR 'two')
于 2012-09-26T15:09:46.377 に答える
0

次のように UNION を使用することもできます。

SELECT 
  DISTINCT * 
FROM 
   table 
WHERE 
    something = ('this', 'that', 'other') 
UNION
SELECT 
  * 
FROM 
   table 
WHERE 
   thingamajig IN ('one', 'two')

各SELECTのフラグ変数を使用して、クエリをより「識別」できます...

SELECT
  'FOO_CASE_1' as case
FROM
  DUAL
UNION
SELECT
  'FOO_CASE_2' as case
FROM
  DUAL
ORDER BY
  1

このようにして、デバッグをより簡単に残すことができます;)

于 2012-09-26T18:04:04.027 に答える