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

Dynamicky generujte sloupce pro křížové tabulky v PostgreSQL

Můžete použít poskytnutou C funkci crosstab_hash za to.

Manuál není v tomto ohledu příliš přehledný. Je to zmíněno na konci kapitoly o crosstab() se dvěma parametry:

Můžete vytvořit předdefinované funkce, abyste nemuseli vypisovat výsledné názvy a typy sloupců v každém dotazu. Viz příklady v předchozí části. Základní funkce C pro tuto formu crosstab se jmenuje crosstab_hash .

Pro váš příklad:

CREATE OR REPLACE FUNCTION f_cross_test_db(text, text)
  RETURNS TABLE (kernel_id int, key1 int, key2 int, key3 int)
  AS '$libdir/tablefunc','crosstab_hash' LANGUAGE C STABLE STRICT;

Volejte:

SELECT * FROM f_cross_test_db(
      'SELECT kernel_id, key, value FROM test_db ORDER BY 1,2'
     ,'SELECT DISTINCT key FROM test_db ORDER BY 1');

Všimněte si, že musíte vytvořit samostatný crosstab_hash funkce pro každý crosstab funkce s jiným návratovým typem.

Související:

  • PostgreSQL od řádků ke sloupcům

Vaše funkce generování seznamu sloupců je poněkud spletitý, výsledek je nesprávný (int chybí za kernel_id ), lze jej nahradit tímto dotazem SQL:

SELECT 'kernel_id int, '
       || string_agg(DISTINCT key::text, ' int, '  ORDER BY key::text)
       || ' int, DUMMY text'
FROM   test_db;

A stejně jej nelze používat dynamicky.



  1. Propojení postgresql se sqlalchemy

  2. Nainstalujte MySQL Workbench pro správu databáze

  3. Oracle:OALL8 je v nekonzistentním stavu

  4. Vyhoďte chybu bránící aktualizaci tabulky ve spouštěči MySQL