Oracleのあいまい検索について

このQ&Aのポイント
  • Oracle(10g)のあいまい検索について。LIKEやOracle textの場合はあくまで部分一致なので、検索対象の文字列(ABC」「DEF」)より長い(ABCDEF)文字列での検索はヒットしないようです。
  • DB上に「ABC」「DEF」という2つのデータがある状態で、「ABCDEF」で検索した場合について、検索結果として「ABC」と「DEF」の両方を得る方法はありますでしょうか?(現状では対象データがありませんとなります。)
  • LIKEによるあいまい検索や、Oracle textによる全文検索では、上記の検索結果を得ることができません。
回答を見る
  • ベストアンサー

Oracleのあいまい検索について

Oracle(10g)のあいまい検索について。 DB上に「ABC」「DEF」という2つのデータがある状態で、 「ABCDEF」で検索した場合について、 検索結果として、「ABC」と「DEF」の両方を得る方法はありますでしょうか? (現状では対象データがありませんとなります。) LIKEによるあいまい検索や、Oracle textによる全文検索では、 上記の検索結果を得ることができません。 LIKEやOracle textの場合はあくまで部分一致なので、 検索対象の文字列([ABC」「DEF」)より長い(「ABCDEF」)文字列での 検索はヒットしないようです。 ご存じの方いましたら、ご教示頂きたいと思います。 以上

  • Oracle
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.2

select 項目 from テーブル where 'ABCDEF' like '%' || 項目 || '%'; regexp_likeを使うなら、 select 項目 from テーブル where regexp_like('ABCDEF', 項目); とかではどうでしょうか。 インデックスが使われないのでパフォーマンスに問題があるとは思いますけど。

kizihide
質問者

お礼

ご回答ありがとうございます。 今回は「where 'ABCDEF' like '%' || 項目 || '%';」の方法を 採用させて頂く予定です。 DB上のデータに「ABC」「DEF」以外に、「Aあ」というような データがあった場合に、「Aあ」はヒットさせたくない為です。 (正規表現を使うと「Aあ」がヒットしてしまいますので。) 最初の質問に少し説明足りない点がありました、申し訳ありません。 とはいえ、上記のやり方でも「AB」というデータがあった場合は、 「AB」がヒットしてしまいます。 ベストは「ABCDEF」で検索して、「ABC」「DEF」のみをヒットさせる ことですが、これは検索文字の「ABCDEF」を任意に切り分けることに なるので、SQLでは無理だろうと考えています。

その他の回答 (1)

  • utakataXEX
  • ベストアンサー率69% (711/1018)
回答No.1

10gなら、正規表現で行けるのでは? REGEXP_LIKE - オラクル・Oracle SQL 関数 ... - SHIFT the Oracle http://www.shift-the-oracle.com/sql/functions/regexp_like.html 正規表現自体は [AD][BE][CF] こんな感じになると思います。 因みにOracle text でも正規表現は使えた記憶があります。 CONTEXT索引タイプでを、かつでCONTAINS演算子内のパターンに入れる事ができたような。 しかし全然検索に引っ掛からないので勘違いかもしれません。 これが可能であれば、単純なREGEXP_LIKEよりもかなり高速です。

kizihide
質問者

お礼

早速のご回答ありがとうございました。 「Aあ」というようなデータがDBにあった場合に、「Aあ」は ヒットさせたくない為、LIKEを使用した方法がベターかと考えておりまして、 今回はNO.2の回答者様の案を採用させて頂く予定です。 正規表現による検索は今まで使ったことがなく、参考になりました。 また、最初の質問に少し説明が足りず、申し訳ありませんでした。

関連するQ&A

  • このような時どう検索すれば良いのでしょうか

    いつもお世話になっています。 テキスト検索ソフトなどで文書を検索する際に、例えば下記のような文字列で人名部分だけ検索結果に表示したい(&出力してリスト化したい)のです。 ------------------------------------------ abc.. [NAME]=suzuki abcdef.. def.. [NAME]=tanaka defghi.. ghi.. [NAME]=yamamoto ghijkl.. ------------------------------------------ 1)人名部分の直前には"[NAME]="のように特定できる文字列があるので検索にはうってつけですが"[NAME]="自体は検索結果には含めたくない。 2)人名部分の直後には半角スペースが入りそれ以降文字列が続きますが、半角スペース以降は検索結果に含めたくない。 正規表現などの使用で可能にする方法があれば、またそういう検索&検索結果のテキスト出力が可能なフリーソフトなどありましたらお教えください。 どうかよろしくお願いします。

  • 検索に関する文字コード

    指定した文字列を元にデータベースよりデータを検索する プログラムを作成したんですが、下記のような不具合が 発生します。 1.例として"ABC DEF"というようにスペースが間に入っている文字列をURLの後に"http://www.aaa.com/test.php?test=ABC DEF"という風にして送ってやり、test.php側で $_GET["test"]として受け取った時に"ABC"となりスペースの前で区切られてしまいます。 2.HTML上のテキストボックスに"ABC CDF"という風に入力してtest.phpに送った場合、test.phpでは文字化けされた状態で受け取ってしまう。 3.特定はできませんが、日本語文字列でも文字化けするものとしないものがあります。 こういった現象から正しく検索処理が行えません。 ちなみに文字コードはすべてEUCで統一しています。 色々調べてはみたんですが、原因がよくわかりません。 解決策等ご存知でしたら教えていただけますよう 宜しくお願い致します。

    • 締切済み
    • PHP
  • Excelで文字列の抽出をしたいので教えてください

    Excelで下記の文字列を抽出したいのですがどなたか教えてください 例) - abcdef xxxx ---- この場合任意の文字桁も不明で最初のブランクの後のabcdefを抽出 -- abc -- def zzz この場合任意の文字,桁も不明で2回目の'--'後のdefを抽出したいのですが宜しくお願いします

  • 秀丸の正規表現(HMJRE.DLL V1.92)で、

    秀丸の正規表現(HMJRE.DLL V1.92)で、 以下のことが可能かどうか教えてください。 ある2つの文字列のいずれも含まない行を 正規表現とGREPで抽出したいのです。 (ほかの手段でもかまいません) たとえば AAAA ABCDEF BCDEFG EFGHI といったテキストデータがあった場合 "ABC"と"DEF"のいずれも含まない行であれば AAAA EFGHI を抽出したいのです。 以上、よろしくお願いします。

  • マクロ(複数文字置換)についての質問です。

    現在、ExcelのA列に置換前の文字、B列に置換後の文字が入っているシート(シート名:"辞書")があります。 そのシートを辞書的役割で使用し別のシートの内容を置換したいと考えています(現在候補が1000文字程度あり、1つずつ置換をすることが難しいです) また、完全一致のみの置換、大文字とから小文字の置換も可能にし、件数も何件存在するかわかりません。 例:ABCをabcに変換したい場合、 ○ABC→abc ×ABCDEF→abcDEF のような感じです。 しかし、1つのセルの中に空白がある場合は置換可能とします。 例:ABC DEF→abc DEF このようなことは可能でしょうか? 何卒よろしくお願いいたします。

  • googleで検索

    googleで、以下のような文字を検索するときは どうすればよいでしょうか? 「$::abc であって、かつ、「abc」しかない文字を含まない 「*abc」 であって、かつ 「abc」しかない文字を含まない 「--abc」 であって、かつ 「abc」しかない文字を含まない 「--abc-def」であって、かつ 「--abc」「--def」 とか、「abc」「def」 でないこと 「(コメント)」であって、かつ 「コメント」でないこと 「$#」 であって、 「$#xa」を含まないこと

  • ORACLE 索引検索について

    ORACLE初心者で索引について勉強しています。 そこでORACLEの索引(Bツリー)検索について2点程質問させていただきます。 (1)索引を用いるとI/O処理が少なくなりアクセスが高速になるということはわかったのですが、そのI/O処理とはプロセスとメモリ間のやりとりに関するI/O処理という認識で間違いないのでしょうか? (2)索引付きと索引なしのカラムを抽出条件にして検索した場合、まず索引付きのカラムから検索を行い、そのROWIDを元に索引なしのカラムのデータを取得して対象データかどうかの判断を行うのでしょうか?

  • Oracleでの検索方法

    現在、Oracle8.1.7で開発しています。 以下のようなことがやりたいのですが、 よい方法が思いつきません。 あるデータをキーにして、テーブルの中にワイルドカードを 含んだデータを検索したいのです。 ※ワイルドカードを逆引きするようなイメージです。 例)  データが『ABC12345』の場合には、Noが『3』のデータを検索したいのです。    テーブルA  NO NAME   1  AA-1   2  AB_1234_  ←このデータを検索したい。   3  BCEDFG 説明が不十分だと思いますが、 どなかたわかる方がいらっしゃったら教えて下さいm(_ _)m

  • あいまい検索について

    お世話になっております。 早速ですが、SQLをどう書けばいいかで悩んでおります。 テーブルの文字列(varchar)の列をl検索します。 テーブルA------------------------ ID value 1 abc 2 defghijklmnopqrstu 3 vwxyzabcdefg 上記のようなテーブルです。 このテーブルのvalue列で、以下の文字列をもっともたくさん 含むものから優先で取得したいのです。 "abc"、"fg"、"vw"、"pqr"、"xyz" この場合、 IDが1の列は"abc" IDが2の列は"fg"、"pqr" IDが3の列は"fg"、"abc"、"xyz" のようにそれぞれ1個、2個、3個と含んでいますから。 SQLの結果セットにIDが3,2,1といった順番で含まれるように 取得したいのです。 where句にlikeを使うくらいはわかるのですが、それから先が 思い浮かびません。 どうかお知恵をおかしください。

    • ベストアンサー
    • MySQL
  • TCHAR文字列内の検索について

    TCHAR文字列内の検索について 質問があります。 #include <tchar.h> TCHAR tex1[8]; TCHAR tex2[8]; TCHAR tex3[8]; TCHAR buf[128] = TEXT("abc,def,ghi"); TCHAR型で宣言された変数bufには、「abc,def,ghi」が格納されているとして、 結果的に tex1 → "abc" tex2 → "def" tex3 → "ghi" となるようなプログラムを作ろうと考えています。(buf内をコンマで区切って3つの変数に代入) まずコンマの位置が何文字目にあるか確認するために TCHAR ret[128]; TCHAR search[128] = TEXT(","); ret = _tcschr( buf, search); としてみましたが、やはりうまくいかずにエラーが出ます。 上記の目的を達成するにはどのようなプログラムを作ればよいのでしょうか? 環境はVisual C++ 2008 Expressで、C言語を使ってプログラミングしています。