PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Suchen Sie in mehreren Tabellen und zeigen Sie auch den Tabellennamen in den resultierenden Zeilen an

Sie suchen nach dynamischem SQL. Stellen Sie Ihre Abfrage automatisch aus dem Systemkatalog zusammen:

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
   );

Erzeugt die Abfragezeichenfolge:

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'
...

Führen Sie es dann in einem zweiten Aufruf aus oder automatisieren Sie es vollständig mit einer PL/pgSQL-Funktion mit EXECUTE . Beispiel:
Wählen Sie einen dynamischen Satz von Spalten aus einer Tabelle aus und erhalten Sie die Summe für jede Spalte

Diese Abfrage erzeugt safe Code mit bereinigten Bezeichnern, die eine SQL-Einschleusung verhindern. (Erklärung für oid::regclass hier.)

Es gibt mehr verwandte Antworten. Verwenden Sie eine Suche.

Übrigens, LIKE in student_name LIKE 'John Doe' ist sinnlos. Ohne Platzhalter verwenden Sie einfach = .