PostgreSQL преобразовывает массив, возвращаемый из функции в столбцы - PullRequest
9 голосов
/ 05 августа 2011

У меня есть функция в PostgreSQL (PLPGSQL), которая возвращает массив, содержащий два элемента. Когда я запускаю оператор выбора, вызывающий функцию, я получаю столбец, содержащий массив (как и ожидалось):

{1, 2}

Что я действительно хотел бы сделать, так это извлечь эти элементы в свои собственные столбцы:

[ 1 | 2 ]

Я обнаружил, что могу сделать:

SELECT (MyFunction())[1], (MyFunction())[2]

Но это вызывает функцию дважды, поэтому удваивает время выполнения (эта функция очень трудоемкая). Есть ли лучший способ справиться с этим?


UPDATE

Вот почти идеальная копия того, что у меня есть:

SELECT table1.a, table1.b, table1.c, (MyFunction(table1.a, table1.b, table1.c))[1],
(MyFunction(table1.a, table1.b, table1.c))[2]
FROM table1
INNER JOIN table2 using(b)
WHERE ... GROUP BY table1.a, table1.b, table1.c;

Опять же, это дает два столбца из массива, но моя функция вызывается дважды, что удваивает время выполнения.

Ответы [ 3 ]

8 голосов
/ 05 августа 2011

вы можете использовать подвыбор?

postgres=# select ar[1], ar[2] from (select string_to_array('a b c', ' ') ar) as sq;
 ar | ar 
----+----
 a  | b
(1 row)

Это все еще требует от вас явного извлечения каждого столбца (как вы уже делаете). Если в массиве больше элементов, чем извлеченных, они будут потеряны, а если их меньше, пропущенные столбцы будут просто NULL.

РЕДАКТИРОВАТЬ: Я думаю, что я бы обернул все это в подразделе; внутренний подвыбор генерирует нужные строки , а внешний выбор проецирует внутренний запрос на нужные столбцы :

SELECT subquery1.a, subquery1.b, subquery1.c, 
    myfunction_result[1], myfunction_result[2] 
FROM ( SELECT table1.a, table1.b, table1.c,
              MyFunction(table1.a, table1.b, table1.c) as myfunction_result
       FROM table1 INNER JOIN table2 using(b) 
       WHERE ... GROUP BY table1.a, table1.b, table1.c
) AS subquery1;

Внутренний и внешний выборки будут правильно соотносить table1 ссылки.

2 голосов
/ 08 ноября 2013
select data[1] as id, data[2] as value from (SELECT 
string_to_array(rs,':') as data from unnest(string_to_array('1:234,2:400',',')) as rs) as foo

Это приведет к:

id|Value
--------
1 | 234
2 | 400
2 голосов
/ 05 августа 2011

Вы не можете этого сделать.Один столбец массива может иметь, например, один массив с тремя элементами, а другой - с пятью элементами.Если вы попытаетесь развернуть эти массивы в отдельные столбцы, в результате вы получите две строки в наборе результатов с разным количеством столбцов, что недопустимо.

Ближайшая доступная вещь - unnest:

разверните массив до набора строк

, но это даст вам строки, а не нужные вам столбцы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...