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?