Postgres:计算 jsonb 中特定键的行数

Postgres: count rows in jsonb for a specific key

我有一个带有两个标签的 table:id INTvalue JSONB。在 value 中,我有一个 json 对象 props,其中包含键 id_1id_2 等,以及它们各自的值。

有没有办法统计JSON对象props有特定键的行,比如id_1

在此示例中,应该有两个结果:第 1 行和第 4 行。

id   |   value
 1   |   {"name": "Jhon",  "props": {"id_1": {"role": "role1", "class": "class1"}, "id_2": {"role": "role2", "class": "class2"}}}
 2   |   {"name": "Frank", "role": ["role1", "role2"]}
 3   |   {"name": "Bob",  "props": {"id_3": {"role": "role3", "class": "class3"}, "id_4": {"role": "role4"}}}
 4   |   {"name": "Carl", "props": {"id_5": {"role": "role5", "class": "class5"}, "id_1": {"class": "class6"}}}

我试过类似的方法,但要使其正常工作,我还必须指定值,但每一行的值都可能发生变化。例如,对于这个查询,我只返回一行。

SELECT count(value)
FROM "myTable" 
where value->'props' ->> 'id_1' = '{"role": "role1", "class": "class1"}'

试试这个-

SELECT COUNT(z.*) FROM (    
SELECT id, value->'props'->>'id_1' as val FROM "myTable" ) z WHERE z.val
IS NOT NULL

使用 ? operator 来测试键是否存在,而不考虑值。

SELECT count(*)
FROM "myTable" 
where value -> 'props' ? 'id_1