2016-05-03 5 views
1

私は、互換性のある一意の識別名を格納する複数の列を持っています。したがって、Col1またはCol2のいずれかが複数のパラメータのいずれかと等しいレコードを選択したいと思います。私は、以下を試してみました。バリエーション、IE、Col1 in (?, ?)またはCol2 in (?, ?)です。複数の列のいずれかがパラメータ値にある行を選択します。

SELECT * FROM Table WHERE EXISTS (Col1, Col2) IN (?, ?); 

は、私は現在、以下のものを使用して、これをacheiveすることができ、それは私が結合したいクエリごとに? in (Col1, Col2)繰り返しているのでしかし、それは、長くて扱いにくいです。

SELECT * FROM Table WHERE ? in (Col1, Col2) OR ? in (Col1, Col2); 

最終的には、私のクエリは、最大1000個のパラメータ(すべてのユニークになります)を有することができるので、上記のクエリを実行するために任意のより自然な方法がある場合、私は不思議でしたか?

+0

DBが正常に正規化されている場合は、行ごとに1つの「ColX」しかありません。このテーブルを検索値と簡単に結合できます。 –

+0

@ CLでは、これには多くの行を持つデータの外部データベース識別子が含まれていますが、多くの場合、それらは互換的に使用されています。いくつかの識別子は異なる仕様からのものであり、一部は同義語であり、一部は競合するグループからのものですが、すべて同じものを参照しています。パフォーマンス重視の作業では、すでにIDタイプを識別して別々にクエリを処理するためにいくつかの正規表現を使用していますが、パフォーマンスに問題がない場合は、怠惰な方法があるかどうか疑問に思っていました。ここでの結合は適切ではありません。 (私はこれが珍しいと理解しています)。 –

+0

@CL、申し訳ありませんが、列がたくさんあります(そして列にはたくさんのデータがあります)。 –

答えて

0

私はusing full-text-index tables (FTS)を調べます。 MATCH演算子を使用すると、複数の検索語を指定できます。

SELECT * from Table WHERE (Col1 MATCH 'this OR that OR something') 
         AND (Col2 MATCH 'this OR that OR something'); 
+0

これは私の理解のために、各列のパラメータを再バインドするか、文字列の書式を使用してクエリに挿入する必要があります。 –

+0

列を連結することを検討しましたか? MATCH文の前にサブクエリとして "SELECT(col1 || col2)AS both_cols FROM Table"を置くことができます。 – Michael

+0

マイケル、私は持っていますが、ワイルドカード文字列の一致が必要です。オプションのどれも最適ではないようで、おそらく@CLが言ったように、これは悪いテーブルデザインを避けるためにSQLの意図的な制限のようです。私は、実行前のソリューション、つまり、チェックの前に識別子の形式に基づいて各パラメータを照合し、各列に対して独立したクエリを実行することが最適かもしれないと思います。 FTSはそれぞれを検証しても良いアプローチです。 –

関連する問題