Postgres json密钥计数
给定N个包含json列的记录Postgres json密钥计数,json,postgresql,Json,Postgresql,给定N个包含json列的记录 |ID |Name |JSON |01 |TEST1 |{"key1" : "value1", "key2": "value2", "key4": "value4"} |02 |TEST1 |{"key1" : "value1"} |03 |TEST2 |{"key1" : "value1", "key2": "value2", "key3":"value3"} ... 计
|ID |Name |JSON
|01 |TEST1 |{"key1" : "value1", "key2": "value2", "key4": "value4"}
|02 |TEST1 |{"key1" : "value1"}
|03 |TEST2 |{"key1" : "value1", "key2": "value2", "key3":"value3"}
...
计算一组键的每个json值的出现次数的最佳策略是什么,例如,对于上面的示例,我将限制为key1、key2、key3和get:-
|value1|value2|value3|
|3 |2 |1 |
这些值将更改,因此我不想显式地查找它们
CREATE TABLE test (id INT4 PRIMARY KEY, some_name TEXT, j json);
copy test FROM stdin;
01 TEST1 {"key1" : "value1", "key2": "value2", "key4": "value4"}
02 TEST1 {"key1" : "value1"}
03 TEST2 {"key1" : "value1", "key2": "value2", "key3":"value3"}
\.
with unpacked as (
SELECT (json_each_text(j)).* FROM test
)
SELECT value, count(*) FROM unpacked WHERE key in ('key1', 'key2', 'key3') group by value;
返回:
value | count
--------+-------
value1 | 3
value3 | 1
value2 | 2
(3 rows)
像你展示的那样返回它对我来说并不是一个好主意(如果有40亿个不同的值,你会怎么做?),但你可以始终在你的应用程序中旋转,或者修改查询以进行数据透视。请跟我重复:如果我真正关心其中存储的内容,我不应该使用json、hstore、xml、eav或任何其他半结构化构造。重复:不要使用。(提示:修复您的模式,同时查看json函数。)