7

私は通常、変数ごとに多くの条件を持つ複数の変数について、非常に大きなテーブルをクエリする必要があります。多くの場合、変数は複数の範囲について照会する必要があります。たとえば、VAR_1が200〜300、350〜400、450〜500の間にあるVAR_1のすべてのレコードが必要になる可能性があります。

通常、これは次のように記述しますIN()が、複数のORの代わりに使用する方がはるかに効率的であると言われています。

SELECT * FROM table
WHERE VAR_1 BETWEEN '200' AND '300' OR
      VAR_1 BETWEEN '350' AND '400' OR
      VAR_1 BETWEEN '450' AND '500'

ORこの情報を凝縮し、ネストLIKEまたはBETWEEN句内の句によってsを取り除く方法はありますIN()か?次のようなもの:

WHERE VAR_1 IN (BETWEEN '200' AND '300', BETWEEN '350' AND '400', BETWEEN '450' AND '500')

また

WHERE VAR_1 IN ('[200-300]','[350-400]','[450-500]')

私はこれらのようなことを試みましたが、構文は明らかに間違っています。あなたが私に指摘できるアイデアや方向性は素晴らしいでしょうが、それでもSQLには非常に新しいものです。

4

1 に答える 1

4

一部のコメントは、IN句がORを使用するよりも効率的である可能性があることを否定しています。これは一般的なケースでは正しくないと思います。

それは単にデータベースのクエリオプティマイザに依存します。

クエリオプティマイザが十分に賢い場合は、OR句とIN句を同じ実行プランに変換します(意味的に等しい場合)。この場合、以降のプラン処理では両方のプランのコストが同じになります。小さな違いの1つは、変換のコストにわずかな違いが生じる可能性があることです。

一方、クエリオプティマイザは、実行プランでOR述語の強い相関関係に気付かず、各範囲述語を個別に評価する場合があります(それぞれが個別の演算子です)が、IN句はすべてのルックアップテーブルによって処理される場合があります。 in句の値(1つの演算子のみ)により、実行時の違いが顕著になります。

したがって、全体的な答えは、DBMSに大きく依存するということです。システムの小さなベンチマーク設定で、両方のバージョンを試してみることをお勧めします。

SQL-92の場合、次のような特別な構文はありません。

WHERE VAR_1 IN ('[200-300]','[350-400]','[450-500]')

したがって、実際にはORまたはINリストしかありません。

のより一般的な表記に注意してください

WHERE VAR_1 IN ( '200', '201' )

WHERE VAR_1 = ANY ('200','201' )

(演算子 "="は、他の比較演算子に置き換えることができます。例: "<=")

于 2012-10-23T12:10:13.050 に答える