- - PR -
1,3,6,9 のようなレコードをSELECTするSQL
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2006-01-13 00:24
現在使用しているテーブルに、横持ち状態になっている列があります。 1から10までの値を複数取り得るということを表現する列です。 例) キー | 検索項目 A001 | 01,03,06,09 A002 | 01 A003 | Null A004 | 01,02,03,05,10 A005 | 03,08,10 ここから以下のような検索をかけるとすると、 どのような構文が効率的でしょうか? 条件ア) 1が含まれる 条件イ) 1および3が含まれる 条件ウ) 1または8が含まれる 条件ア)なら SELECT * FROM テーブル WHERE 検索項目 LIKE 01% あたりかと思います。 条件イ)条件ウ)ではどのような方法がよいか教えてください。 よろしくお願いいたします。 補足1 - - - - - - - - - - - - - - - - - 横持ちにしないようにすることができればいいのですが、 この検索のために正規化するよりも横持ちの形のほうが 多くのユーザにメリットがあるため構造を変えることは 難しそうです。 補足2 - - - - - - - - - - - - - - - - - 私はまったく経験がないのですが、ぼんやりと ビット演算を利用するのがいいかなと思い、 ビット演算を使ったことがある人に相談したところ、 保守が大変だからお勧めしないと言われました。 |
|
投稿日時: 2006-01-13 02:53
こんばんは
条件ア)(検索項目 like '%01%') 条件イ)(検索項目 like '%01%' and 検索項目 like '%03%') 条件ウ)(検索項目 like '%01%' or 検索項目 like '%08%') とかじゃないですかね? MySQLなら REGEXP(正規表現)というのが使えますけどね 条件ア) 検索項目 REGEXP '01' ※01に関しては出現位置が先頭以外ありえないならば REGEXP '^01' ですね。 条件イ) 検索項目 REGEXP '01' and 検索項目 REGEXP '03' ※順序が固定であるなら REGEXP '01.*03' なんて書き方もできるかも... 条件ウ) 検索項目 REGEXP '0[18]' しかし、like や regexpは検索のCPUコストが高いので、最終的なメリットに なるかどうかは、疑問です。 |
|
投稿日時: 2006-01-14 00:20
jk様、ご回答ありがとうございます。
そうでした。正規表現という手がありました。 Oracle10g を使用してますので MySQL の REGEXP は使用できませんね。 今検索してみて初めて知ったのですが 10g から REGEXP_LIKE、REGEXP_INSTR、REGEXP_SUBSTR、REGEXP_REPLACE というものが使えるようになったみたいです。 http://www.atmarkit.co.jp/fdb/rensai/sqlclinic01/sqlclinic01_1.html 正規表現を使うとア、ウは単純な構文で検索できそうです。 (検索コストが低いかどうかは別として) イの場合では '0(1|3)' か '01|03' あたりでいけそうな気がします。 月曜日に試してみたいと思います。 |
1