PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Изключете паралелно множество масиви

Ще обичате тази нова функция на Postgres 9.4 :

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

unnest() с дългоочакваната (поне от мен) способност за паралелно изключване на множество масиви чисто . Ръководството:

разширяване на множество масиви (евентуално от различни типове) до набор от редове. Това е позволено само в клаузата FROM;

Това е специална реализация на новия ROWS FROM функция.

Вашата функция вече може да бъде просто:

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;

Обадете се:

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

Разбира се, простият формуляр може да бъде заменен с обикновен SQL (без допълнителна функция):

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

В по-ранни версии (Postgres 9.3- ), можете да използвате по-малко елегантната и по-малко безопасна форма:

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;

Предупреждения за старата стенограма:освен че е нестандартна да има функция за връщане на набор в SELECT списък, броят на върнатите редове би бил най-ниското общо кратно на броя на елементите на всеки масив (с изненадващи резултати за неравни числа). Подробности в тези свързани отговори:

  • Паралелна unnest() и ред на сортиране в PostgreSQL
  • Има ли нещо като функция zip() в PostgreSQL, която комбинира два масива?

Това поведение най-накрая е санирано с Postgres 10 . Множество функции за връщане на набор в SELECT списък произвежда редове в "lock-step" сега. Вижте:

  • Какво е очакваното поведение за множество функции, връщащи набор в клауза 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. Как да определя последния ден от предишния месец с помощта на PostgreSQL?

  2. Защо функциите PL/pgSQL могат да имат страничен ефект, докато SQL функциите не могат?

  3. Поправка:„операторът не съществува:цяло число || цяло число” в PostgreSQL

  4. Най-добрите инструменти за сигнали и известия за PostgreSQL

  5. GUI инструмент за PostgreSQL