sql >> Base de Datos >  >> RDS >> PostgreSQL

Desanida múltiples arreglos en paralelo

Te amarás esta nueva característica de Postgres 9.4 :

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

unnest() con la muy esperada (al menos por mí) capacidad para desensamblar múltiples arreglos en paralelo limpiamente . El manual:

expanda varias matrices (posiblemente de diferentes tipos) a un conjunto de filas. Esto solo está permitido en la cláusula FROM;

Es una implementación especial del nuevo ROWS FROM característica.

Tu función ahora puede ser simplemente:

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;

Llamar:

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

Por supuesto, el formulario simple se puede reemplazar con SQL simple (sin función adicional):

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

En versiones anteriores (Postgres 9.3- ), puede usar la forma menos elegante y menos segura:

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;

Advertencias de la antigua forma abreviada:además de no ser estándar, tiene una función de retorno de conjunto en SELECT list, el número de filas devueltas sería el múltiplo común más bajo de cada número de elementos de la matriz (con resultados sorprendentes para números desiguales). Detalles en estas respuestas relacionadas:

  • Unnest() paralelo y orden de clasificación en PostgreSQL
  • ¿Existe algo como una función zip() en PostgreSQL que combine dos arreglos?

Este comportamiento finalmente se ha saneado con Postgres 10 . Múltiples funciones de devolución de conjuntos en SELECT lista producir filas en "paso de bloqueo" ahora. Ver:

  • ¿Cuál es el comportamiento esperado para varias funciones de devolución de conjuntos en la cláusula SELECT?