在WHERE子句中使用jsonb数组:Directives表过滤查询问题
正确的PostgreSQL JSONB数组过滤查询
你的原SQL存在两个问题:一是IN子句语法错误(PostgreSQL要求用圆括号而非方括号),二是类型不匹配——filters->'names'返回的是jsonb数组,无法直接和字符串集合做比较。以下是两种符合需求的正确查询方式:
方法一:使用?|操作符(简洁高效)
?|是PostgreSQL专门为jsonb数组提供的操作符,用于判断数组是否包含指定字符串数组中的任意一个元素:
SELECT * FROM directives WHERE filters->'names' ?| ARRAY['yourname', 'theirname'];
方法二:使用jsonb_array_elements_text展开数组(灵活拓展)
如果需要对数组元素做更复杂的逻辑处理,可以先将jsonb数组展开为文本行,再通过EXISTS子查询判断:
SELECT * FROM directives d WHERE EXISTS ( SELECT 1 FROM jsonb_array_elements_text(d.filters->'names') AS name WHERE name IN ('yourname', 'theirname') );
内容的提问来源于stack exchange,提问作者Rafael Mora
相关产品推荐
相关产品推荐

