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

标签 arrays postgresql pattern-matching

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

SELECT 'hello' = ANY(ARRAY['hello', 'bees'])

但是如果我想检查数组中是否存在多个值怎么办?例如,如果数组中存在“hello”或“bye”,我想返回 true。我想做类似的事情

SELECT ['hello', 'bye'] = ANY(ARRAY['hello', 'bees'])

但这似乎不起作用。

编辑:

我还想弄清楚如何检查数组中是否存在多个值中的任何一个,其中多个值具有共同的前缀。

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

SELECT ARRAY['hello%'] && ARRAY['helloOTHERSTUFF']

是真的。

最佳答案

要检查任何数组元素是否存在于另一个数组中,请使用重叠 &&像这样的运算符:

SELECT ARRAY[1,4,3] && ARRAY[2,1] -- true

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

测试用例:

我将数组元素放在不同的行中,以阐明哪个比较结果为真,哪个为假。

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); 

因此,如果任何比较结果为 false,则 bool_and(array_elements) 将返回 false。

注意:如果您需要将您的数组与多个模式进行比较,您可以使用 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); 

关于arrays - 检查 Postgres 中的数组中是否存在多个值中的任何一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38881063/

相关文章:

scala - 包含子字符串列表中的确切子字符串的字符串

php - 通过 jQuery Ajax 传递 PHP 数组

java - 如何获取字符串数组中的数字并将它们放入 int 数组中

java - 如何使用 PostgreSQL 和 Hibernate 映射 Java 多维数组

sql - REGEX 日期匹配格式

Python 模式匹配正则表达式

javascript - 如何为每个有大写字母的单词添加不同的颜色?

postgresql - 无法将sql文件导入Windows中的PostgreSql

历史表中的 SQL LEFT JOIN

c# - 如何在 F# 记录类型中为 null 匹配 .NET 类型列表?