sql >> Database >  >> RDS >> PostgreSQL

Zoek in meerdere tabellen en geef ook de tabelnaam weer in de resulterende rijen

U bent op zoek naar dynamische SQL. Stel uw zoekopdracht automatisch samen uit de systeemcatalogus:

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

Produceert de zoekreeks:

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

Voer het vervolgens in een tweede aanroep uit of automatiseer het volledig met een PL/pgSQL-functie met behulp van EXECUTE . Voorbeeld:
Selecteer een dynamische set kolommen uit een tabel en verkrijg de som voor elke

Deze zoekopdracht levert veilig . op code met opgeschoonde identifiers die SQL-injectie voorkomen. (Uitleg voor oid::regclass hier.)

Er zijn meer gerelateerde antwoorden. Gebruik een zoekopdracht.

Tussen haakjes, LIKE in student_name LIKE 'John Doe' is zinloos. Gebruik zonder jokertekens gewoon = .



  1. hoe een database te plaatsen en de database te lezen uit de activamap van Android die is gemaakt en geëxporteerd in sqllite

  2. Oracle Set-operators

  3. MySQL 8 Algemene tabeluitdrukkingen CTE

  4. Kolomnaam of aantal opgegeven waarden komt niet overeen met tabeldefinitie