- - PR -
oracleでinで曖昧検索のような機能がありますか?
1|2|3
次のページへ»
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2008-04-14 10:16
複数の名称を曖昧検索したいのですが
select * from table where name in ('%名前1%','%名前2%') のような感じで select * from table where name like '%名前1%' or '%名前2%' のようなSQLを簡略化して書けないでしょうか? | ||||
|
投稿日時: 2008-04-14 10:33
saki1208です。
見たことないですね。 サブクエリを使用しては駄目なのですか? | ||||
|
投稿日時: 2008-04-14 10:54
saki1208さま返信ありがとうございます。
サブクエリというとこんな感じでしょうか? select * from table where nameKey in ( select namekey from table where name like '%名前1%' or '%名前2%' ・・・・ ) javaからSQLを発行するつもりなのですが '%名前1%'の部分の項目数が動的に変更されるので 簡単な書式があったらと思いまして・・・。 | ||||
|
投稿日時: 2008-04-14 11:35
Java/C#/Perl/PHP といった言語で書かれたものから呼び出すのであれば IN 句を動的に生成すれば済みますが、Oracle 内で完結となると少し厄介ですね。
可変長引数をとるストアドプロシージャと動的 SQL(ストアドプロシージャ内で SQL 文を組み立ててそれを実行するもの)を組み合わせれば書けると思います。 以下、ご参考までにまとまって説明されていると思えたサイトをご紹介します。 (「動的SQL 可変長引数」で検索して見つかったものですが、「動的」「SQL」「可変」などの単語に分解されてしまい、見つかるサイトも Java や PHP の場合の例が多く、Oracle PL/SQL での参考になるものはそれほど多くないようでした。) ・可変長引数 http://www.shift-the-oracle.com/plsql/collection/ ・動的 SQL http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/sq_pl09.htm いずれにしても Oracle だけで処理しようとすると PL/SQL およびストアドプロシージャの実装知識が必須ですのでご注意ください。 | ||||
|
投稿日時: 2008-04-14 11:53
うう、「Java から」という説明を見逃していましたorz
それなら PreparedStatement は使えませんが、文字列操作で IN 句の内容を作成すれば OK ですね。 (ただし、SQL インジェクション対策にはご注意ください。) もちろん、可変長引数をとる CallableStatement を用意しておいて Java から呼び出しても構いません。 | ||||
|
投稿日時: 2008-04-14 15:24
Gioさま返信ありがとうございます。
曖昧検索をしたいので javaで動的なSQL文を作成時に「in」を使用できずに 「or」でつないでいくことになると思うのですが パフォーマンス時に問題ないでしょうか? やはりOracle側で何かしらPL/SQLで用意した方が早いでしょうか? | ||||
|
投稿日時: 2008-04-14 15:55
contains関数じゃだめですか?
select * from table where contains(name, '(名前1 or 名前2)', 1) > 0 詳しくは下記を。 http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/text.102/B19214-01/csql.htm#i997503 | ||||
|
投稿日時: 2008-04-14 15:57
実行計画を取得すれば、必要なコストはわかります。 一般論的には どちらにせよINDEXが使われないため大差はないと思います。 それ以外のおこりうる問題は 最悪の場合 インデックスが、使われないその問い合わせが集中すると CPU資源やメモリーを食いつぶし応答レスポンスが悪くなるぐらいです。 [ メッセージ編集済み 編集者: 七味唐辛子 編集日時 2008-04-14 16:11 ] |
1|2|3
次のページへ»