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

Ekvivalent unpivot() v PostgreSQL

Vytvořte příklad tabulky:

CREATE TEMP TABLE foo (id int, a text, b text, c text);
INSERT INTO foo VALUES (1, 'ant', 'cat', 'chimp'), (2, 'grape', 'mint', 'basil');

Můžete 'unpivot' nebo 'uncrosstab' pomocí UNION ALL:

SELECT id,
       'a' AS colname,
       a AS thing
FROM foo
UNION ALL
SELECT id,
       'b' AS colname, 
       b AS thing
FROM foo
UNION ALL
SELECT id, 
       'c' AS colname,
       c AS thing
FROM foo
ORDER BY id;

To spustí 3 různé dílčí dotazy na foo , jeden pro každý sloupec, který chceme zrušit, a vrátí v jedné tabulce každý záznam z každého poddotazu.

Ale to prohledá tabulku N-krát, kde N je počet sloupců, které chcete uvolnit. To je neefektivní a je to velký problém, když například pracujete s velmi velkým stolem, jehož skenování trvá dlouho.

Místo toho použijte:

SELECT id,
       unnest(array['a', 'b', 'c']) AS colname,
       unnest(array[a, b, c]) AS thing
FROM foo
ORDER BY id;

To se snadněji píše a tabulku to naskenuje pouze jednou.

array[a, b, c] vrátí objekt pole s hodnotami a, b a c jako prvky.unnest(array[a, b, c]) rozdělí výsledky do jednoho řádku pro každý z prvků pole.

Doufám, že to pomůže!



  1. Jak získat strukturu databáze v MySQL pomocí dotazu

  2. Obnova databáze Oracle

  3. Způsob, jak zkontrolovat, že Oracle dokončil sql

  4. Jak odečíst 30 dní od aktuálního data pomocí SQL Server