Postgresql记录到数组

时间:2014-04-22 08:00:46

标签: sql arrays postgresql record

我需要从数组转换为行并返回数组以过滤记录。 我在SELECT查询中使用 information_schema._pg_expandarray 在数组中为每个值获取一行。

给出以下数组:

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

我需要过滤此结果集,以排除包含&#39; <&#39; 的记录。

我该怎么做?我应该转换回数组吗? 有没有办法直接过滤阵列?

提前致谢。

1 个答案:

答案 0 :(得分:0)

如果您的目标是生成一组如上所述的行,但行中包含&#39; t&#39;删除,然后这就行了:

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(),这似乎没有记录并且通过领先的&#39; _&#39;在名称中可能是供内部使用。

似乎没有任何内置函数来过滤数组。你的问题意味着你可能想要以数组形式得到结果 - 如果是这种情况那么写一个简单的函数是微不足道的。这是一个例子:

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)