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

複数のテーブルを検索し、結果の行にテーブル名を表示します

    動的SQLを探しています。システムカタログからクエリを自動的にアセンブルします:

    SELECT string_agg('SELECT student_name, '''
                       || c.oid::regclass || ''' AS tbl, pid FROM '
                       || c.oid::regclass
                       || $$ WHERE student_name = 'John Doe'$$
                     , E'\nUNION ALL\n')
    FROM   pg_namespace n
    JOIN   pg_class     c ON c.relnamespace = n.oid
    WHERE  n.nspname = 'public'         -- schema name where your tables lie
    AND    c.relname LIKE 't%'          -- and / or filter table names
    AND    EXISTS (
       SELECT 1 FROM pg_attribute 
       WHERE  attrelid = c.oid
       AND    attname = 'student_name'  -- make sure column exists
       AND    NOT attisdropped          -- and is alive
       );
    

    クエリ文字列を生成します:

    SELECT student_name, 'tbl1' AS tbl, pid FROM tbl1 WHERE student_name = 'John Doe'
    UNION ALL
    SELECT student_name, 'tbl2' AS tbl, pid FROM tbl2 WHERE student_name = 'John Doe'
    UNION ALL
    SELECT student_name, 'tbl3' AS tbl, pid FROM tbl3 WHERE student_name = 'John Doe'
    ...
    

    次に、2回目の呼び出しで実行するか、EXECUTEを使用してPL/pgSQL関数で完全に自動化します。 。例:
    テーブルから動的な列のセットを選択し、それぞれの合計を取得します

    このクエリは安全を生成します SQLインジェクションを防ぐサニタイズされた識別子を持つコード。 (oid::regclassの説明 ここに。)

    より多くの関連する答えがあります。検索を使用します。

    ところで、LIKE student_name LIKE 'John Doe'で 無意味です。ワイルドカードを使用しない場合は、=を使用してください 。



    1. SQLServerデータベースにすべてのストアドプロシージャを一覧表示する3つの方法

    2. Oracleに複数のレコードを挿入します

    3. SQLiteDatabaseエラーsqlite:(1)near):構文エラー

    4. SQLSELECTAND演算子