我有一个包含以下示例内容的jsonb列:
{"kay1": val1, "myMap": {"UniqueKey1": "UniqueValue1", "UniqueKey2": "UniqueValue2", "UniqueKey3": "UniqueValue3", "UniqueKey4": "UniqueValue4"}, "key2": {"key3": {"key4": "val4"}, "val3": {"key5": "val5"}}
我想找到所有'myMap'中条目数量大于/等于/小于某个整数的行--我有几百万这样的行,因此如果可以使用索引也会很有帮助!
在上面的示例中,'myMap'中有4个条目。因此,对于像“select * from myTable where jsonb_key_length(myJsonbColumn-> 'myMap') = 4”这样的查询,上面的行应该被返回。[假设有一个返回给定json对象长度的函数jsonb_key_length()]
我在这里找到了类似的问题:Postgres json key count。
但是,它需要键的名称,是否可以不使用键名来完成?
解决方案
感谢@jmelesky的建议。
以下查询对我有效:
SELECT id, count(elements)
FROM (SELECT id, jsonb_object_keys(column -> 'myMap') AS elements
FROM myTable GROUP BY id
) x
GROUP BY id
包括@jmelesky的建议
SELECT id, (SELECT count(*)
FROM (SELECT jsonb_object_keys(a->'myMap')
FROM test_json x where x.id = y.id
) z
) count
FROM test_json y group by id;
找到了另一个更快的解决方案。
SELECT id, ARRAY_LENGTH(ARRAY(SELECT jsonb_object_keys(column -> 'myMap')), 1) AS count
FROM myTable
使用索引:
创建一个函数:
CREATE OR REPLACE FUNCTION jsonb_object_keys_length(_j jsonb)
RETURNS INT LANGUAGE SQL IMMUTABLE AS
'SELECT ARRAY_LENGTH(ARRAY(SELECT jsonb_object_keys(column -> 'myMap')), 1)';
创建索引:
CREATE INDEX idx_myMapCount ON myTable (jsonb_object_keys_length(column -> 'myMap'));
在查询中使用函数:
SELECT id, jsonb_object_keys_length(column -> 'myMap') AS count
FROM myTable
如果有更好的建模方法,请提出建议。谢谢!
select id, (select count(*) from (select jsonb_object_keys(a->'myMap') from test_json x where x.id = y.id) z) count from test_json y group by id;
应该就可以了。 - jmelesky