Pokochasz pokochasz ta nowa funkcja Postgresa 9.4 :
unnest(anyarray, anyarray [, ...])
unnest()
z długo oczekiwaną (przynajmniej przeze mnie) możliwością rozgnieżdżania wielu tablic równolegle czysto . Instrukcja:
rozwiń wiele tablic (być może różnych typów) do zestawu wierszy. Jest to dozwolone tylko w klauzuli FROM;
Jest to specjalna implementacja nowego ROWS FROM
funkcja.
Twoja funkcja może teraz być po prostu:
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;
Zadzwoń:
SELECT * FROM multi_unnest(123, '{100, 40.5, 76}'::numeric[]
, '{01-2222-05,01-3333-04,01-4444-08}'::text[]);
Oczywiście prosty formularz można zastąpić zwykłym SQL (brak dodatkowej funkcji):
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);
We wcześniejszych wersjach (Postgres 9.3- ), możesz użyć mniej eleganckiej i mniej bezpiecznej formy:
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;
Zastrzeżenia starej skróconej formy:poza tym, że jest to niestandardowe, aby mieć funkcję zwracania zestawu w SELECT
lista, liczba zwracanych wierszy byłaby najniższą wspólną wielokrotnością liczby elementów każdej tablicy (z zaskakującymi wynikami dla nierównych liczb). Szczegóły w tych powiązanych odpowiedziach:
- Równoległe unnest() i porządek sortowania w PostgreSQL
- Czy jest coś takiego jak funkcja zip() w PostgreSQL, która łączy dwie tablice?
To zachowanie zostało ostatecznie zdezynfekowane za pomocą Postgres 10 . Wiele funkcji zwracania zestawu w SELECT
lista tworzy teraz wiersze w "lock-step". Zobacz:
- Jakie jest oczekiwane zachowanie wielu funkcji zwracających zestaw w klauzuli SELECT?