我需要从数组转换为行,然后再转换回数组以过滤记录。我在SELECT查询中使用information_schema._pg_expandarray来获取数组中每个值一行。
给定以下数组:
"char"[]
{i,i,o,t,b}
_pg_expandarray使用记录类型为1的列恢复5行:
record
(i,1)
(i,2)
(o,3)
(t,4) <= to be filtered out later
(b,5)
我需要过滤此结果集以排除包含't'的记录。
我怎样才能做到这一点 ?我应该转换回数组吗?有没有一种方法可以直接对数组进行过滤?
提前致谢。
如果您的目标是生成如上所述的一组行,但是删除了包含“ 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()
over 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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句