【问题标题】:Evaluate whether an array contains an element other than given elements评估数组是否包含给定元素以外的元素
【发布时间】:2020-04-07 08:10:10
【问题描述】:

我正在尝试确定我的给定数组 _servicetype 是否包含 12、1、2、3 以外的元素。 以下是我目前所拥有的,


场景 1:如果我的数组是 {1,2,3,6015} 我想要 FALSE

场景 2:如果我的数组是 {1,2,12} 我想要 TRUE

场景 3:如果我的数组是 {1,2} 我想要 true


我最终在 Postgres 中将 iif 语句创建为用户定义的函数,并得到以下结果:

 IIF(_servicetype@>ARRAY['12']::INT[]
  OR _servicetype@>ARRAY['1'] ::INT[]
  OR _servicetype@>ARRAY['2'] ::INT[]
  OR _servicetype@>ARRAY['3'] ::INT[],TRUE,FALSE)::BOOLEAN 

我担心它不适用于场景 1。

【问题讨论】:

  • 您的数组可以包含 NULL 值吗? (然后标准数组运算符@><@ 等都出来了。)您是否只使用整数数组?请记住始终披露正在使用的 Postgres 版本。 SELECT version();

标签: arrays postgresql plpgsql


【解决方案1】:

您可以使用@>(包含/覆盖)运算符检查ARRAY[12, 1, 2, 3] 是否是_servicetype 的超集,即如果_supertype 包含不在ARRAY[12, 1, 2, 3] 中的任何内容,则返回false

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)

【讨论】:

  • 抓住了,因此 contains 运算符单独查看每个元素。我的印象是 contains 运算符将数组视为一个整体。学到东西了!谢谢
  • @DanielL.VanDenBosch:当您说“包含运算符将数组视为一个整体”时,我不确定我是否明白您的意思,但如果您的意思是您认为该操作被视为“切片” -重叠”那么事实并非如此。我更新了我的答案以展示一个例子。
猜你喜欢
  • 1970-01-01
  • 2016-10-13
  • 2010-11-13
  • 2022-09-23
相关资源
最近更新 更多