如何检查数组的多维数组包含数组?

Dmi*_*try 6 postgresql array

我有一组数组 [ID, TYPE]。

所有值都是整数。数组可以是integer[]jsonb类型。

SELECT array[[442,2],[443,2]]

SELECT to_jsonb(array[[1,2],[3,4]])
Run Code Online (Sandbox Code Playgroud)

如何检查此数组是否包含数组 [443,2]?

编辑 这里描述的检查方法之一。

1# SELECT array[[442,2],[443,2]] @> array[443,2] -- returns True
2# SELECT array[[442,2],[443,2]] @> array[2,443] -- returns True too
Run Code Online (Sandbox Code Playgroud)

对于我的情况,我想得到 False 2#

a_h*_*ame 6

从技术上讲,Postgres 中没有二维数组这样的东西。手册中的引用

当前的实现也没有强制执行声明的维数。[...] 因此,在 CREATE TABLE 中声明数组大小或维数只是文档;它不影响运行时行为

所以该值array[[442,2],[443,2]]在内部存储为array[442,2,443,2],这就是为什么array[[442,2],[443,2]] @> array[2,443]为真的原因,因为它在内部表示为array[442,2,443,2] @> array[2,443]which 显然是真的。

但是,如果您声明行类型的数组,则可以这样做。

create type idtype as (id integer, type integer);
Run Code Online (Sandbox Code Playgroud)

然后您可以执行以下操作:

select array[(442,2), (443,2)]::idtype[] @> array[(442,2)]::idtype[];
--> true
Run Code Online (Sandbox Code Playgroud)

select array[(442,2), (443,2)]::idtype[] @> array[(2,442)]::idtype[];
--> false
Run Code Online (Sandbox Code Playgroud)