sql >> Databáze >  >> RDS >> PostgreSQL

Vyhledávání ve více tabulkách a také zobrazení názvu tabulky ve výsledných řádcích

Hledáte dynamické SQL. Sestavte svůj dotaz ze systémového katalogu automaticky:

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

Vytvoří řetězec dotazu:

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

Poté jej spusťte ve druhém volání nebo jej zcela automatizujte pomocí funkce PL/pgSQL pomocí EXECUTE . Příklad:
Vyberte dynamickou sadu sloupců z tabulky a získejte součet pro každý

Tento dotaz produkuje bezpečné kód s vyčištěnými identifikátory zabraňujícími vkládání SQL. (Vysvětlení pro oid::regclass zde.)

Souvisejících odpovědí je více. Použijte vyhledávání.

BTW, LIKE v student_name LIKE 'John Doe' je zbytečné. Bez zástupných znaků stačí použít = .



  1. Průvodce Pgpool pro PostgreSQL:Část druhá

  2. jQuery UI Sortable, pak zapište pořadí do databáze

  3. Ovladač HikariCP Postgresql tvrdí, že nepřijímá JDBC URL

  4. Mám odstranit nebo zakázat řádek v relační databázi?