1

これに対する解決策をブルートフォースする方法を知っています。私は主に、将来のために自分の知識を増やすためのエレガントなソリューションを探しています。

20 個のコード フラグ フィールドを持つデータ テーブルがあります。(CODE_01、CODE_02、CODE_03、...、CODE_20)

これらのコード列のいずれかに特定の値 (例: 11、12、24、141 など) が含まれるレコードを探しています。

私はこのようにすることができます:

Select * from table
where CODE_01 IN (11, 12, 24, 141)
   or CODE_02 IN (11, 12, 24, 141)
   or ...
   or CODE_20 IN (11, 12, 24, 141);

またはこのように:

Select * from table
where 11 IN (CODE_01, CODE_02, ..., CODE_20)
   or 12 IN (CODE_01, CODE_02, ..., CODE_20)
   or 24 IN (CODE_01, CODE_02, ..., CODE_20)
   or 141 IN (CODE_01, CODE_02, ..., CODE_20);

どちらも機能し、コピー/貼り付けの演習にすぎません。これに似たものがあるかどうか疑問に思っています:

Select * from table
where (11, 12, 24, 141) IN (CODE_01, CODE_02, ..., CODE_20);

また

Select * from table
where (CODE_01, CODE_02, ..., CODE_20) IN (11, 12, 24, 141);

理論的には、20 個のフィールドを連結し、それを正規表現で検索できると思いますが、実行するのはかなり非効率的な (そして遅い) クエリだと思います。

ありがとう

4

3 に答える 3

2

テーブルを作成することがおそらく「正しい」解決策であるという@GorndonLinoffに同意しcodeますが、テーブルの構造を変更せずに試すことができるトリックを次に示します。

クエリを作成するときに関連する値がわかっている場合は、インライン リストを からの一連の化されたUNIONクエリに置き換えてから、演算子dualを使用してそれをテーブルに結合できます。IN

SELECT *
FROM   some_table
JOIN   (SELECT 11 as val FROM dual
        UNION ALL
        SELECT 12 as val FROM dual
        UNION ALL
        SELECT 24 as val FROM dual
        UNION ALL
        SELECT 141 as val FROM dual)
ON     val IN (code_01, code_02, ... code_20);

もちろん、一連のSELECTs fromdualをいつでも一時テーブルに置き換えることができますが、これが基本的な考え方です。

少し遊んでみたい場合は、 SQLFiddleで(かなり)簡略化されたデモを作成しました。

于 2013-11-04T17:45:26.293 に答える
0

これがより速いかどうかはわかりませんが、試してみてください

select * from table t
where exists 
 (Select * From 
   (Select PK, CODE_01 code from table Union 
    Select PK, CODE_02 code from table Union 
    Select PK, CODE_03 code from table Union 
    Select PK, CODE_04 code from table Union 
    ...
    Select PK, CODE_19 code from table Union 
    Select PK, CODE_20 code from table) z
  Where z.PK = t.PK
     And z.code in (11, 12, 24, 141))

また...

select * from table t
  join (Select PK, CODE_01 code Union 
        Select PK, CODE_02 code Union 
        Select PK, CODE_03 code Union 
        Select PK, CODE_04 code Union 
        ...
        Select PK, CODE_19 code Union 
        Select PK, CODE_20 code) z
    On z.PK = t.PK
Where z.code in (11, 12, 24, 141))
于 2013-11-04T17:48:07.633 に答える