array -> table как?

Например, enum_range() возвращает одну строку с массивом типа:
{'Yes','No'}. А я хочу конвертировать этот результат в две строки:
Yes
No

Без этого использовать тип enum и массивы вообще - не очень удобно.

Не подскажете типовое решение этой задачи?

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

CREATE OR REPLACE FUNCTION

 CREATE OR REPLACE FUNCTION "arr_to_table" (arr "pg_catalog"."anyarray") 
 RETURNS SETOF "pg_catalog"."anyelement" AS
$body$
declare
  i int;
  ub int;
BEGIN
ub:=array_upper(arr,1);
IF ub then
  FOR i IN 1..ub  loop 
    RETURN next arr[i];
  end loop;
end IF;
END;
$body$
LANGUAGE 'plpgsql';

Что-то не выходит каменный цветок :(

SELECT enum_range(null::tt_office);
"{Самара,Тольятти,Краснодар,Все}"

А если:

SELECT arr_to_table(enum_range(null::tt_office));

ERROR: invalid input syntax for type boolean: "4"
CONTEXT: PL/pgSQL function "arr_to_table" line 6 at IF

********** Ошибка **********

ERROR: invalid input syntax for type boolean: "4"
SQL state: 22P02
Контекст:PL/pgSQL function "arr_to_table" line 6 at IF

AltLinux
# rpm -qa | grep postgresql
postgresql8.3-8.3.5-alt0.M41.1

что я делаю не так?

Отвечаю сам себе

Нашел кривой, но рабочий способ:

 SELECT regexp_split_to_table(array_to_string(enum_range(NULL::tt_office),';'),';') AS tt_office;

Нашел наконец-то правильный ответ!

http://gray-hemp.blogspot.com/2009/02/enum.html

Вопрос: Дан ENUM, Есть ли такой запрос, который выведет список всех элементов, допустимых этим ENUM-ом?

Ответ: Да.

CREATE TYPE myenum AS enum ('red','green','blue');
SELECT enumlabel 
   FROM pg_enum 
   WHERE enumtypid = 'myenum'::regtype 
   ORDER BY oid;
 
 enumlabel
-----------
 red
 green
 blue
(3 rows)

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023