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

すべてのテーブルのすべてのフィールドで特定の値を検索(Oracle)

    引用:

    以下のステートメントを使用して、名前を付ける必要があると思うものに基づいて適切な列を見つけようとしましたが、結果が返されませんでした。*

    SELECT * from dba_objects WHERE
    object_name like '%DTN%'
    

    列はオブジェクトではありません。列名が「%DTN%」のようになることを期待している場合、必要なクエリは次のとおりです。

    SELECT owner, table_name, column_name FROM all_tab_columns WHERE column_name LIKE '%DTN%';
    

    しかし、「DTN」文字列があなたの側の単なる推測である場合、それはおそらく役に立たないでしょう。

    ちなみに、「1/22 / 2008P09RR8」は、単一の列から直接選択された値であるとどの程度確信していますか。どこから来ているのかまったくわからない場合は、複数の列の連結、関数の結果、またはネストされたテーブルオブジェクトにある値である可能性があります。そのため、すべての列でその値をチェックしようとしている可能性があります。この値を表示しているクライアントアプリケーションから始めて、それを取得するためにどのクエリを使用しているかを把握することはできませんか?

    とにかく、diciuの答えは、すべてのテーブルのすべての列の値をチェックするSQLクエリを生成する1つの方法を提供します。 PL / SQLブロックと動的SQLを使用して、1つのSQLセッションで同様のことを完全に実行することもできます。そのために急いで書かれたコードを次に示します。

        SET SERVEROUTPUT ON SIZE 100000
    
        DECLARE
          match_count INTEGER;
        BEGIN
          FOR t IN (SELECT owner, table_name, column_name
                      FROM all_tab_columns
                      WHERE owner <> 'SYS' and data_type LIKE '%CHAR%') LOOP
    
            EXECUTE IMMEDIATE
              'SELECT COUNT(*) FROM ' || t.owner || '.' || t.table_name ||
              ' WHERE '||t.column_name||' = :1'
              INTO match_count
              USING '1/22/2008P09RR8';
    
            IF match_count > 0 THEN
              dbms_output.put_line( t.table_name ||' '||t.column_name||' '||match_count );
            END IF;
    
          END LOOP;
    
        END;
        /
    

    それをより効率的にする方法もいくつかあります。

    この場合、探している値が与えられると、NUMBERまたはDATEタイプの列を明確に削除できます。これにより、クエリの数が減ります。タイプが「%CHAR%」のような列に制限することもできます。

    列ごとに1つのクエリを作成する代わりに、次のようにテーブルごとに1つのクエリを作成できます。

    SELECT * FROM table1
      WHERE column1 = 'value'
         OR column2 = 'value'
         OR column3 = 'value'
         ...
         ;
    


    1. QPSQLドライバーがロードされていませんQt

    2. SQLServerコレクションインベントリスクリプト-2

    3. インデックスが多いテーブルの一括挿入が遅い

    4. SQLでの一時テーブルの作成