sql >> Database teknologi >  >> RDS >> PostgreSQL

Fjern flere arrays parallelt

Du vil elske denne nye funktion i Postgres 9.4 :

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

unnest() med den længe ventede (i hvert fald af mig) evne til at fjerne flere arrays parallelt rent . Manualen:

udvide flere arrays (muligvis af forskellige typer) til et sæt rækker. Dette er kun tilladt i FROM-sætningen;

Det er en speciel implementering af den nye ROWS FROM funktion.

Din funktion kan nu blot være:

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 til:

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

Selvfølgelig kan den simple form erstattes med almindelig SQL (ingen ekstra 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 tidligere versioner (Postgres 9.3- ), kan du bruge den mindre elegante og mindre sikre form:

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;

Forbehold i den gamle stenografiform:udover at være ikke-standard at have sæt-returnerende funktion i SELECT liste, ville antallet af returnerede rækker være det laveste fælles multiplum af hvert arrays antal elementer (med overraskende resultater for ulige tal). Detaljer i disse relaterede svar:

  • Parallel unnest() og sorteringsrækkefølge i PostgreSQL
  • Er der noget som en zip()-funktion i PostgreSQL, der kombinerer to arrays?

Denne adfærd er endelig blevet renset med Postgres 10 . Flere sæt-returnerende funktioner i SELECT liste producere rækker i "lock-step" nu. Se:

  • Hvad er den forventede adfærd for flere sæt-returnerende funktioner i SELECT-sætning?


  1. Hvordan påvirker uforanderlige, stabile og flygtige søgeord funktionsadfærd?

  2. Mysql - slet fra flere tabeller med én forespørgsel

  3. Sådan bygger du et JSON-array fra mysql-databasen

  4. Nyttige tips til fejlfinding af almindelige fejl i MySQL