PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Rozpakuj wiele tablic równolegle

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?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ograniczenia tabel krzyżowych w PostgreSQL

  2. Jak sprawdzić wersję PostgreSQL

  3. Zrozumienie ograniczeń sprawdzania w PostgreSQL

  4. PG::DuplicateTable:BŁĄD:posty relacji już istnieją

  5. 2 sposoby zwracania wierszy zawierających znaki niealfanumeryczne w PostgreSQL