sql >> データベース >  >> RDS >> Oracle

OracleTextインデックスのデータと一致しないワイルドカードとドットを使用したクエリ

    これは、デフォルトのレクサーがピリオドを単語の区切り文字として扱っているためです。

    初期設定:

    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;
    

    これにより、次のような動作が得られます:

    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
    

    PRINTJOINS 期間を含める:

    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
    

    テキストインデックス要素の詳細



    1. UNION、EXCEPT、またはINTERSECTを使用している場合、PostgreSQLの「エラー:列「colname」が存在しません」を修正しました

    2. postgresqlアプリケーションでrailsで移行を実行した後のシーケンスに関する通知

    3. SQL ServerでGETDATE()をミリ秒単位で出力する方法は?

    4. PostgresエラーパラメータTimeZoneの値が無効です:UTC