sql >> Databasteknik >  >> RDS >> PostgreSQL

Ta bort flera arrayer parallellt

Du kommer att älska denna nya funktion i Postgres 9.4 :

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

unnest() med den mycket efterlängtade (åtminstone av mig) förmågan att rent avlösa flera arrayer parallellt . Manualen:

expandera flera arrayer (möjligen av olika typer) till en uppsättning rader. Detta är endast tillåtet i FROM-satsen;

Det är en speciell implementering av den nya ROWS FROM funktion.

Din funktion kan nu bara vara:

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;

Ring:

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

Naturligtvis kan den enkla formen ersättas med vanlig SQL (ingen extra funktion):

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);

I tidigare versioner (Postgres 9.3- ), kan du använda den mindre eleganta och mindre säkra formen:

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;

Förbehåll för den gamla förkortningen:förutom att vara icke-standard att ha set-retur-funktion i SELECT listan, skulle antalet returnerade rader vara den lägsta gemensamma multipeln av varje arrays antal element (med överraskande resultat för ojämna tal). Detaljer i dessa relaterade svar:

  • Parallell unnest() och sorteringsordning i PostgreSQL
  • Finns det något som en zip()-funktion i PostgreSQL som kombinerar två arrayer?

Detta beteende har äntligen sanerats med Postgres 10 . Flera set-returfunktioner i SELECT lista producera rader i "lock-step" nu. Se:

  • Vad är det förväntade beteendet för flera set-returfunktioner i SELECT-satsen?


  1. Snabbt och smutsigt för loopar i det omedelbara fönstret

  2. INITCAP() Funktion i Oracle

  3. Anslut ODBC-applikationer på Windows till Zoho CRM

  4. Kör SCRIPT från PL/SQL Block