Arrays 评估数组是否包含给定元素以外的元素
我试图确定给定的数组_servicetype是否包含12,1,2,3以外的元素。 以下是我到目前为止的情况 场景1:如果我的数组是{1,2,36015},我希望为FALSE 场景2:如果我的数组是{1,2,12},我希望为TRUE 场景3:如果我的数组是{1,2},我希望为true 我最终在Postgres中将iif语句创建为用户定义的函数,并得到以下结果:Arrays 评估数组是否包含给定元素以外的元素,arrays,postgresql,plpgsql,Arrays,Postgresql,Plpgsql,我试图确定给定的数组_servicetype是否包含12,1,2,3以外的元素。 以下是我到目前为止的情况 场景1:如果我的数组是{1,2,36015},我希望为FALSE 场景2:如果我的数组是{1,2,12},我希望为TRUE 场景3:如果我的数组是{1,2},我希望为true 我最终在Postgres中将iif语句创建为用户定义的函数,并得到以下结果: IIF(_servicetype@>ARRAY['12']::INT[] OR _servicetype@>ARRAY[
IIF(_servicetype@>ARRAY['12']::INT[]
OR _servicetype@>ARRAY['1'] ::INT[]
OR _servicetype@>ARRAY['2'] ::INT[]
OR _servicetype@>ARRAY['3'] ::INT[],TRUE,FALSE)::BOOLEAN
我担心的是它不适用于场景1。您可以使用@>contains/covers操作符检查数组[12,1,2,3]是否是\u servicetype的超集,即如果\u supertype包含数组中没有的任何内容[12,1,2,3],则返回false:
明白了,所以contains操作符单独查看每个元素。我的印象是contains操作符将数组视为一个整体。学到了一些东西!thanks@DanielL.VanDenBosch:当你说contains操作符将数组视为一个整体时,我不确定我是否理解了你的意思,但是如果你的意思是你认为该操作考虑了切片重叠,那么事实并非如此。我更新了我的答案来展示一个例子。你的数组能包含空值吗?然后是标准数组运算符@>,
WITH examples(_servicetype) AS (
VALUES
('{1,2,3,6015}'::int[]),
('{2,1}'::int[]),
('{1}'::int[])
)
SELECT _servicetype, '{12, 1, 2, 3}' @> _servicetype
FROM examples;
┌──────────────┬──────────┐
│ _servicetype │ ?column? │
├──────────────┼──────────┤
│ {1,2,3,6015} │ f │
│ {2,1} │ t │ -- set-wise "contains", order does not matter
│ {1} │ t │
└──────────────┴──────────┘
(3 rows)