sql >> Databasteknik >  >> RDS >> PostgreSQL

Sök i flera tabeller och visa även tabellnamn i resulterande rader

Du letar efter dynamisk SQL. Sammanställ din fråga från systemkatalogen automatiskt:

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

Producerar frågesträngen:

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

Kör det sedan i ett andra anrop eller automatisera det helt med en PL/pgSQL-funktion med EXECUTE . Exempel:
Välj en dynamisk uppsättning kolumner från en tabell och få summan för varje

Den här frågan ger safe kod med sanerade identifierare som förhindrar SQL-injektion. (Förklaring till oid::regclass här.)

Det finns fler relaterade svar. Använd en sökning.

BTW, LIKE i student_name LIKE 'John Doe' är meningslöst. Utan jokertecken, använd bara = .



  1. Möten på arbetsplatsen:Återta utrymme från en överdimensionerad databas

  2. Matcha utbud med efterfrågan – lösningar, del 3

  3. Lär dig att utföra produktanalys med SQL Server Full-Text Search. Del 2

  4. Rekommenderat sätt / beställning att läsa data från en webbtjänst, analysera den data och infoga den i en SQLite db