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

Zrušte vnoření více polí paralelně

Budete milovat tuto novou funkci Postgres 9.4 :

unnest(anyarray, anyarray [, ...])

unnest() s tolik očekávanou (alespoň mnou) schopností zrušit vnoření více polí paralelně čistě . Manuál:

rozšířit více polí (možná různých typů) na sadu řádků. To je povoleno pouze v klauzuli FROM;

Je to speciální implementace nového ROWS FROM funkce.

Vaše funkce nyní může být:

CREATE OR REPLACE FUNCTION multi_unnest(_some_id int
                                      , _amounts numeric[]
                                      , _invoices text[])
  RETURNS TABLE (some_id int, amount numeric, invoice text) AS
$func$
SELECT _some_id, u.* FROM unnest(_amounts, _invoices) u;
$func$ LANGUAGE sql;

Volejte:

SELECT * FROM multi_unnest(123, '{100, 40.5, 76}'::numeric[] 
                        , '{01-2222-05,01-3333-04,01-4444-08}'::text[]);

Jednoduchý formulář lze samozřejmě nahradit obyčejným SQL (žádná další funkce):

SELECT 123 AS some_id, *
FROM unnest('{100, 40.5, 76}'::numeric[]
          , '{01-2222-05,01-3333-04,01-4444-08}'::text[]) AS u(amount, invoice);

V dřívějších verzích (Postgres 9.3- ), můžete použít méně elegantní a méně bezpečnou formu:

SELECT 123 AS some_id
     , unnest('{100, 40.5, 76}'::numeric[]) AS amount
     , unnest('{01-2222-05,01-3333-04,01-4444-08}'::text[]) AS invoice;

Upozornění staré zkrácené formy:kromě toho, že je nestandardní, mít v SELECT funkci vracení sady seznamu, počet vrácených řádků by byl nejnižší společný násobek počtu prvků každého pole (s překvapivými výsledky pro nestejná čísla). Podrobnosti v těchto souvisejících odpovědích:

  • Paralelní unnest() a pořadí řazení v PostgreSQL
  • Existuje v PostgreSQL něco jako funkce zip(), která kombinuje dvě pole?

Toto chování bylo konečně dezinfikováno pomocí Postgres 10 . Více funkcí pro vrácení sady v SELECT seznam produkovat řádky v "lock-step" nyní. Viz:

  • Jaké je očekávané chování pro více funkcí vracejících sadu v klauzuli SELECT?


  1. Jak vytvořit skutečný vztah jeden k jednomu na serveru SQL Server

  2. Jak převést počet minut do formátu hh:mm v TSQL?

  3. MIN() vs LEAST() v MySQL:Jaký je rozdíl?

  4. Vícenásobné použití stejného sloupce v klauzuli WHERE