如何在Supabase中查询包含指定值的JSONB数组列?
正确查询JSONB数组列中包含指定user值的行
你的问题出在没处理JSONB数组的结构——users列是数组类型,不是单个JSON对象,直接用users -> user根本取不到值,因为数组本身没有user这个键,得先遍历数组里的元素再判断。
下面给两种可行的写法,包括原生SQL和你用的查询构建器(比如Knex)的写法:
方法1:用JSONB包含操作符@>
这种写法简洁高效,适合精确匹配数组中的对象片段:
原生SQL
SELECT * FROM your_table WHERE users @> '[{"user": 123}]'::jsonb;
查询构建器(Knex)写法
.from('your_table') .select('*') .whereRaw('users @> ?::jsonb', ['[{"user": 123}]'])
方法2:用jsonb_array_elements展开数组+EXISTS子查询
如果需要更灵活的条件(比如模糊匹配、多条件组合),可以用这种方式:
原生SQL
SELECT * FROM your_table t WHERE EXISTS ( SELECT 1 FROM jsonb_array_elements(t.users) elem WHERE elem->>'user' = '123' );
查询构建器(Knex)写法
.from('your_table as t') .select('*') .whereExists(function() { this.fromRaw('jsonb_array_elements(t.users) as elem') .whereRaw("elem->>'user' = ?", ['123']); })
注意:如果user字段是数值类型,用elem->'user' = 123(不带第二个>)也可以,但用->>转成字符串再匹配更稳妥,避免类型转换问题。
内容的提问来源于stack exchange,提问作者chichi
相关产品推荐
相关产品推荐

