- PR -

oracleでinで曖昧検索のような機能がありますか?

投稿者投稿内容
osiete
常連さん
会議室デビュー日: 2008/03/17
投稿数: 26
投稿日時: 2008-04-14 10:16
複数の名称を曖昧検索したいのですが

select *
from table
where name in ('%名前1%','%名前2%')

のような感じで

select *
from table
where name like '%名前1%'
or '%名前2%'

のようなSQLを簡略化して書けないでしょうか?
saki1208
ベテラン
会議室デビュー日: 2006/08/22
投稿数: 86
投稿日時: 2008-04-14 10:33
saki1208です。

見たことないですね。

サブクエリを使用しては駄目なのですか?
osiete
常連さん
会議室デビュー日: 2008/03/17
投稿数: 26
投稿日時: 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%'の部分の項目数が動的に変更されるので
簡単な書式があったらと思いまして・・・。
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 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 およびストアドプロシージャの実装知識が必須ですのでご注意ください。
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2008-04-14 11:53
うう、「Java から」という説明を見逃していましたorz

それなら PreparedStatement は使えませんが、文字列操作で IN 句の内容を作成すれば OK ですね。
(ただし、SQL インジェクション対策にはご注意ください。)

もちろん、可変長引数をとる CallableStatement を用意しておいて Java から呼び出しても構いません。
osiete
常連さん
会議室デビュー日: 2008/03/17
投稿数: 26
投稿日時: 2008-04-14 15:24
Gioさま返信ありがとうございます。


曖昧検索をしたいので
javaで動的なSQL文を作成時に「in」を使用できずに
「or」でつないでいくことになると思うのですが
パフォーマンス時に問題ないでしょうか?

やはりOracle側で何かしらPL/SQLで用意した方が早いでしょうか?

ひで
常連さん
会議室デビュー日: 2005/04/27
投稿数: 41
お住まい・勤務地: 神戸
投稿日時: 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

七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2008-04-14 15:57
引用:

曖昧検索をしたいので
javaで動的なSQL文を作成時に「in」を使用できずに
「or」でつないでいくことになると思うのですが
パフォーマンス時に問題ないでしょうか?


実行計画を取得すれば、必要なコストはわかります。
一般論的には どちらにせよINDEXが使われないため大差はないと思います。

それ以外のおこりうる問題は 最悪の場合 インデックスが、使われないその問い合わせが集中すると CPU資源やメモリーを食いつぶし応答レスポンスが悪くなるぐらいです。









[ メッセージ編集済み 編集者: 七味唐辛子 編集日時 2008-04-14 16:11 ]

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