如何检查数组是否在多维数组中

时间:2017-07-29 14:27:30

标签: arrays postgresql multidimensional-array

我想使用过滤查询检查一个数组是否等于另一个可以被视为数组数组的多维数组的元素。

例如:

鉴于多维数组unhandled Exception GeneralSecurityException ,我想检查其中一个数组元素的一维数组。

预期结果:

  • 输入:{{1,2}, {3,4}, {5,6}}{1,2} - >输出:{3,4}
  • 输入:TRUE{2,3} - >输出:{1,5}

我已经尝试了FALSE,但它会为所有示例案例返回<@,如果不切片多维数组,我就无法使用TRUE

有没有人在没有使用ANY的情况下有解决方案?

2 个答案:

答案 0 :(得分:1)

在没有任何pgpsql的情况下,这似乎是一个难以解决的问题。但是,如果使用此功能,则更简单: https://wiki.postgresql.org/wiki/Unnest_multidimensional_array

CREATE OR REPLACE FUNCTION public.reduce_dim(anyarray)
RETURNS SETOF anyarray AS
$function$
DECLARE
    s $1%TYPE;
BEGIN
    FOREACH s SLICE 1  IN ARRAY $1 LOOP
        RETURN NEXT s;
    END LOOP;
    RETURN;
END;
$function$
LANGUAGE plpgsql IMMUTABLE;

使用:

 create table array_test (arr integer[][]);
 insert into array_test (select '{{1,2}, {3,4}, {5,6}}');

 select (case when '{1,2}' in (select reduce_dim(arr) from array_test) then true 
         else false end);
 case
 ------
 t
(1 row)

select (case when '{1,4}' in (select reduce_dim(arr) from array_test) then true 
         else false end);
 case
------
 f
(1 row)

答案 1 :(得分:1)

简单方法:在数组中搜索,如字符串:

select '{{1, 2}, {3, 4}, {5, 6}}'::int[][]::text like '%{1,2}%';

复杂方式:将数组分解为切片(不含plpgsql):

with t(x) as (values('{{1, 2}, {3, 4}, {5, 6}}'::int[][]))
select *
from t
where (
  select bool_or(x[s:s] = '{{1,3}}') from generate_subscripts(x,1) as s);