检查Postgres中的数组中是否存在多个值中的任何一个

Vin*_*ent 6 arrays postgresql pattern-matching

检查数组中是否存在一个值非常简单.例如,以下内容将返回true.

SELECT 'hello' = ANY(ARRAY['hello', 'bees'])
Run Code Online (Sandbox Code Playgroud)

但是,如果我想检查数组中是否存在多个值,该怎么办?例如,如果数组中存在'hello'或'bye',我想返回true.我想做点什么

SELECT ['hello', 'bye'] = ANY(ARRAY['hello', 'bees'])
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用.

编辑:

我还想弄清楚如何检查多个值是否具有公共前缀的数组中是否存在多个值.

例如,如果我想在数组包含前缀为'hello'的任何元素时返回true.所以我基本上想要类似的东西

SELECT ARRAY['hello%'] && ARRAY['helloOTHERSTUFF']
Run Code Online (Sandbox Code Playgroud)

是真实的.

Kam*_*ski 6

要检查另一个数组中是否存在任何数组元素,请使用重叠&&运算符,如下所示:

SELECT ARRAY[1,4,3] && ARRAY[2,1] -- true
Run Code Online (Sandbox Code Playgroud)

检查每个数组元素是否都匹配特定的模式,您可以unnest(anyarray)将其与LIKE或POSIX正则表达式(应用模式匹配)结合使用(提取数组元素)函数和聚合bool_and(expression)-执行按位AND运算符并返回一行输出。

测试用例:

我将数组元素放在单独的行中,以澄清哪个比较产生正确的结果,哪个比较产生错误的结果。

SELECT bool_and(array_elements)
FROM (
  SELECT unnest(
    ARRAY[
     'hello', -- compared with LIKE 'hello%' yields true
     'helloSOMething', -- true
     'helloXX', -- true
     'hell', -- false
     'nothing' -- false
    ]) ~~ 'hello%'
  ) foo(array_elements); 
Run Code Online (Sandbox Code Playgroud)

因此,如果任何比较得出false,则bool_and(array_elements)将会返回false。

注意:如果需要将数组与多个模式进行比较,则可以进行POSIX比较并使用POSIX比较|。举个例子,假设我们要确定数组的每个元素是否都以hellonot词开头:

SELECT bool_and(array_elements)
FROM (
  SELECT unnest(
    ARRAY[
     'hello', -- true
     'helloSOMething', -- true
     'helloXX', -- true
     'hell', -- false (doesn't start with neither "hello" nor "not")
     'nothing' -- true (starts with not)
    ]) ~ '^hello|not' -- note the use of ~ instead of ~~ as earlier (POSIX vs LIKE)
  ) foo(array_elements); 
Run Code Online (Sandbox Code Playgroud)