【问题标题】:Postgresql record to arrayPostgresql 记录到数组
【发布时间】:2014-04-22 08:00:46
【问题描述】:

我需要将数组转换为行,然后再转换回数组以过滤记录。 我在 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)

我需要过滤此结果集以排除包含 't' 的记录。

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

提前致谢。

【问题讨论】:

    标签: sql arrays postgresql record


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-14
      • 2013-04-21
      • 1970-01-01
      相关资源
      最近更新 更多