postgresql 如何通过多个键过滤jsonb字段?

pjngdqdw  于 6个月前  发布在  PostgreSQL
关注(0)|答案(2)|浏览(67)

我有一些组有一个jsonb字段-目标
my SQL

SELECT DISTINCT groups.* 
FROM groups 
WHERE groups.user_id = 1 AND (
  EXISTS (
    SELECT * FROM jsonb_array_elements(targets) as a 
    WHERE a->>'name' ~* 'gender|age'
  ) 
)

字符串
这将返回仅包含性别或仅包含年龄或同时包含性别和年龄的组。
如何修复它,使其仅返回具有性别 * 和 * 年龄的组
我的jsonb字段目标看起来像这样

[{"name"=>"gender", "value"=>"0"}, {"name"=>"age", "value"=>"1"}]

pbpqsu0x

pbpqsu0x1#

如何修复它,使其仅返回同时具有性别和年龄的组
您可以通过使用GROUP BYHAVING子句来实现这一点,通过使用count()函数和case子句来确保这两个元素的存在:

SELECT user_id, targets
FROM groups
CROSS JOIN jsonb_array_elements(targets) as a 
GROUP BY user_id, targets
HAVING COUNT( CASE WHEN a->>'name' = 'gender' THEN 1 END) = 1
       AND COUNT( CASE WHEN a->>'name' = 'age' THEN 1 END) = 1;

字符串
Demo here

ybzsozfc

ybzsozfc2#

你可以使用jsonb_path_exists。参见文档。

SELECT
  g.*
FROM groups g
WHERE g.user_id = 1
  AND jsonb_path_exists(g.targets, '$[*].name = "gender"')
  AND jsonb_path_exists(g.targets, '$[*].name = "age"');

字符串

相关问题