2016-06-17 8 views
1

テキスト検索のドットとワイルドカード文字を組み合わせて使用​​すると、照会で一致する行が見つかりません。例えばワイルドカードとドットがOracleテキスト索引と一致しない問合せ

CREATE TABLE MY_TABLE(ITEM_NUMBER VARCHAR2(50 BYTE) NOT NULL); 
INSERT INTO MY_TABLE (ITEM_NUMBER) VALUES ('1234.1234'); 
create index TIX_ITEMNO on MY_TABLE(ITEM_NUMBER) indextype is ctxsys.context; 

ITEM_NUMBER列は '1234.1234'

これは、行を見つけるんです私はMY_TABLE内の行を検索する:

SELECT * FROM MY_TABLE 
WHERE CONTAINS(ITEM_NUMBER, '%1234') > 0 

これは見つけられません。行:

SELECT * FROM MY_TABLE 
WHERE CONTAINS(ITEM_NUMBER, '%.1234') > 0 

私はなぜオラクルによればドットがエスケープされなければならない特殊文字ではないので、私は理解していない。

どのようにこの状況を処理する必要がありますか?

+0

最初のデータと一致するデータは何ですか、2番目のデータと一致しません。 – Nivas

+1

クエリの実行中のサンプル入力データと期待される結果を表示してください。 – OldProgrammer

+0

'.1234 'で終わる' text'の値はありません。 –

答えて

3

を望んでいたと思います。

初期設定:あなたはピリオドを含めるようにPRINTJOINSを定義レクサーを追加する場合

SELECT * FROM MY_TABLE 
WHERE CONTAINS(ITEM_NUMBER, '%1234') > 0; 

-------------------------------------------------- 
1234.1234 

SELECT * FROM MY_TABLE 
WHERE CONTAINS(ITEM_NUMBER, '%.1234') > 0; 

no rows selected 

create table my_table(item_number varchar2(50 byte) not null); 

insert into my_table values ('1234.1234'); 

create index my_index on my_table (item_number) 
indextype is ctxsys.context; 

これは、あなたが見る振る舞いを取得

drop index my_index; 

begin 
    ctx_ddl.create_preference('my_lexer', 'BASIC_LEXER'); 
    ctx_ddl.set_attribute('my_lexer', 'PRINTJOINS', '.'); 
end; 
/

create index my_index on my_table (item_number) 
indextype is ctxsys.context 
parameters ('lexer my_lexer'); 

それあなたが望むように動作します:

SELECT * FROM MY_TABLE 
WHERE CONTAINS(ITEM_NUMBER, '%.1234') > 0; 

ITEM_NUMBER 
-------------------------------------------------- 
1234.1234 

Read more about text indexing elements

+0

スーパーexplaination。 :) –

0

私はあなたのデフォルトのレクサーは、単語の区切りとしての期間を扱っているので、これがある

SELECT * FROM MY_TABLE 
WHERE ITEM_NUMBER like '%.1234' 
+0

はい。それはLIKEで動作しますが、なぜそれがCONTAINSで動作しないのかを知りたいのです。 – Palmi

関連する問題