PostgreSQL如何判断数组所有元素是否存在于表的指定列中?
检查数组所有元素是否存在于表列并返回布尔值
方法1:PostgreSQL 原生数组操作(推荐)
直接利用PostgreSQL的数组运算符和聚合函数,简洁高效:
SELECT array['a', 'b', 'c'] <@ array_agg(DISTINCT test) AS all_exists FROM t;
array_agg(DISTINCT test):把表t的test列去重后聚合成一个数组<@:数组包含运算符,判断左边数组的所有元素是否都在右边数组里,直接返回true或false
如果test列本身没有重复值,可以去掉DISTINCT加快查询:
SELECT array['a', 'b', 'c'] <@ array_agg(test) AS all_exists FROM t;
方法2:通用SQL写法(适配多数数据库)
如果用的不是PostgreSQL,或者需要跨数据库兼容,可以用统计匹配数量的方式:
SELECT (SELECT COUNT(DISTINCT val) FROM UNNEST(array['a', 'b', 'c']) AS val WHERE val IN (SELECT test FROM t)) = 3 AS all_exists;
UNNEST:将数组拆分成单独的行(不同数据库语法略有差异,比如MySQL用JSON_TABLE,SQL Server用STRING_SPLIT,核心逻辑一致)- 统计数组中能在
test列找到的元素数量,和数组总长度(这里是3)对比,相等就说明所有元素都存在
如果数组长度不确定,PostgreSQL可以用array_length动态获取:
SELECT (SELECT COUNT(DISTINCT val) FROM UNNEST(array['a', 'b', 'c']) AS val WHERE val IN (SELECT test FROM t)) = array_length(array['a','b','c'], 1) AS all_exists;
内容的提问来源于stack exchange,提问作者Shh
相关产品推荐
相关产品推荐

