1. ホーム
  2. sql

[解決済み] 全テーブルの全フィールドを特定の値で検索する (Oracle)

2022-07-14 17:36:58

質問

Oracle では、すべてのテーブルのすべてのフィールドで、特定の値を検索することは可能ですか?

何百ものテーブルがあり、いくつかのテーブルでは何千もの行があるので、クエリに非常に長い時間がかかることは承知しています。しかし、私が知っているのは、私がクエリを実行したいフィールドの値が 1/22/2008P09RR8 . <

私は以下のこのステートメントを使って、私が考える名前に基づいて適切なカラムを見つけようとしましたが、結果は何も返されませんでした。

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

このデータベースに関するドキュメントはまったくなく、このフィールドがどこから引き出されているのか見当もつきません。

何か考えはありますか?

どのように解決するのですか?

引用元

以下のようなステートメントを使ってみました。 を使用して、適切なカラムを検索してみました。 という名前にしようとしましたが は結果を返しませんでした。

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' が 1 つの列から直接選択された値であることは、どの程度確実なのでしょうか。 どこから来たのかまったくわからない場合、複数の列を連結したものであったり、関数の結果であったり、ネストされたテーブル オブジェクトにある値であったりする可能性があります。 だから、その値についてすべてのカラムをチェックしようとすると、無駄足になるかもしれない。 この値を表示しているクライアント アプリケーションから始めて、その値を取得するためにどのようなクエリを使用しているかを把握することはできないのでしょうか?

とにかく、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'
     ...
     ;