- PR -

1,3,6,9 のようなレコードをSELECTするSQL

1
投稿者投稿内容
パンダ++
会議室デビュー日: 2005/12/10
投稿数: 8
投稿日時: 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 - - - - - - - - - - - - - - - - -
私はまったく経験がないのですが、ぼんやりと
ビット演算を利用するのがいいかなと思い、
ビット演算を使ったことがある人に相談したところ、
保守が大変だからお勧めしないと言われました。

jk
ベテラン
会議室デビュー日: 2005/08/19
投稿数: 94
投稿日時: 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コストが高いので、最終的なメリットに
なるかどうかは、疑問です。
パンダ++
会議室デビュー日: 2005/12/10
投稿数: 8
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)