Postgresql запись в массив

Мне нужно конвертировать из массива в строки и обратно в массив для фильтрации записей. Я использую information_schema._pg_expandarray в запросе SELECT, чтобы получить одну строку на значение в массиве.

Учитывая следующий массив:

"char"[]
{i,i,o,t,b}

_pg_expandarray повторяет 5 строк с 1 столбцом типа записи:

record
(i,1)
(i,2)
(o,3)
(t,4) <= to be filtered out later
(b,5)

Мне нужно отфильтровать этот набор результатов, чтобы исключить записи, которые содержат "т".

Как я могу это сделать? Должен ли я преобразовать обратно в массив? Есть ли способ фильтрации по массиву напрямую?

Заранее спасибо.

1 ответ

Решение

Если ваша цель - создать набор строк, как указано выше, но с удаленной строкой, содержащей 't', то это поможет:

test=> select * 
       from  information_schema._pg_expandarray(array['i','i','o','t','b']) as a(i)
       where a.i!='t';
 i | n
---+---
 i | 1
 i | 2
 o | 3
 b | 5
(4 rows)

Кроме того, если вы не хотите, чтобы индекс возвращался как второй столбец, я был бы склонен использовать unnest() над information_schema._pg_expandarray(), который, по-видимому, не задокументирован и, судя по начальному '_' в названии, вероятно, предназначен для внутреннего использования.

Кажется, нет никакой встроенной функции для фильтрации массивов. Ваш вопрос подразумевает, что вы можете захотеть получить результат в виде массива - если это так, то написание простой функции тривиально. Вот пример:

CREATE OR REPLACE FUNCTION array_filter(anyarray, anyelement) RETURNS anyarray
AS $$
DECLARE
   inArray ALIAS FOR $1;
   filtValue ALIAS FOR $2;
   outArray ALIAS FOR $0;
   outIndex int=0;
BEGIN
   FOR I IN array_lower(inArray, 1)..array_upper(inArray, 1) LOOP
    IF inArray[I] != filtValue THEN
        outArray[outIndex] := inArray[I];
        outIndex=outIndex+1;
    END IF;
   END LOOP;
RETURN outArray;
END;
$$ LANGUAGE plpgsql 
STABLE 
RETURNS NULL ON NULL INPUT;

Использование:

test=> select array_filter(array['i','i','o','t','b'],'t');
  array_filter
-----------------
 [0:3]={i,i,o,b}
(1 row)
Другие вопросы по тегам