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

特定の値を保持する可能性のあるすべてのレコードのSQL選択

    したがって、データベースに対してGoogleのようなフリーテキスト検索を実行する必要があります。これは可能ですが、パフォーマンスはTeh Suckになります! Googleは、インデックスにインデックスがあり、データストアが重複しており、通常、この種の検索のためにすべてを最適化するため、高速です。

    とにかく、これは動的SQLとOracleデータディクショナリを使用した概念実証です。列を検索するデータの種類、つまり文字列に制限していることに注意してください。

    SQL> set serveroutput on size unlimited
    SQL> declare
      2      dummy varchar2(1);
      3  begin
      4      for r in ( select table_name, column_name from user_tab_cols
      5                 where data_type in ('VARCHAR2', 'CHAR', 'CLOB') )
      6      loop
      7          begin
      8              execute immediate 'select null from '||r.table_name
      9                      ||' where '||r.column_name||' like ''%&search_value%'' '
     10                      ||' and rownum = 1'
     11                 into dummy;
     12              dbms_output.put_line('Found it in >>>'
     13                     ||r.table_name||'.'||r.column_name);
     14          exception
     15              when others then
     16                  -- bad practice ahoy!
     17                  null;
     18          end;
     19      end loop;
     20  end;
     21  /
    Enter value for search_value: MAISIE
    old   9:                ||' where '||r.column_name||' like ''%&search_value%'' '
    new   9:                ||' where '||r.column_name||' like ''%MAISIE%'' '
    Found it in >>>T23.NAME
    
    PL/SQL procedure successfully completed.
    
    SQL>
    

    より堅牢な実装では、大文字と小文字、単語全体などを処理する必要がある場合があります。10g以上を使用している場合は、正規表現が役立つ可能性がありますが、正規表現と動的SQLを組み合わせるのは興味深いことです。 見込み客。

    繰り返しますが、パフォーマンスはTeh Suckになります!大規模なデータセット。すべての列にインデックスを付けることはできず、LIKEまたは同様のあいまい一致をサポートしないため、調整することは事実上不可能です。別のアプローチは、XQueryを使用してデータのXML表現を生成し、Textを使用してデータにインデックスを付けることです。このようなリポジトリを維持することはオーバーヘッドになりますが、特に本番環境でこの機能を定期的に必要とする場合、その努力は健全な投資になります。

    all_tab_colsを使用すると、権限のあるすべてのテーブルをより広範囲に検索できます。 代わりは。

    for r in ( select owner, table_name, column_name from all_tab_cols
                       where data_type in ('VARCHAR2', 'CHAR', 'CLOB') )
    

    明らかに、生成されたステートメントで所有スキーマのプレフィックスを付ける必要があります。

    execute immediate 'select null from '||r.owner||'.'||r.table_name
                           ||' where '||r.column_name||' like ''%
    


    1. 挿入ステートメントのレコード数(Oracle)

    2. スケジュールされた時間にPHPスクリプトを実行する方法

    3. MariaDB VERSION()の説明

    4. SQLGROUPBY-プロのように結果をグループ化するための3つの簡単なヒント