postgres-在jsonb数组字段中查询唯一值

时间:2018-07-23 17:21:50

标签: sql postgresql jsonb

我有一个带有jsonb列“元数据”的表。在元数据列中有多个键值对,因此表的格式如下:

hash  metadata
1     {"type": ["A, B"],    "Name": ["One"]}
2     {"type": ["A, B, C"], "Name": ["Two"]}
3     {"type": ["B, C"],    "Name": ["Three"]}
4     {"type": ["B"],       "Name": ["Four"]}

我正在尝试查询表,以获取包含每种唯一类型的元素的数量,例如:

type  :  count
"A"   :   2
"B"   :   4
"C"   :   2

我浏览了Postgres 9.6文档和许多其他堆栈溢出线程,并尝试了几件事,而我能找到的最接近的是这样的东西:

Select jsonb_array_elements(t.metadata -> 'Type') as type, count(DISTINCT t.hash)
FROM table AS t
GROUP BY type

返回:

 type     :  count
"A, B"    :   1
"A, B, C" :   1
"B, C"    :   1
"B"       :   1

在postgresql中有什么方法可以做到吗?

谢谢

1 个答案:

答案 0 :(得分:1)

您的元数据列格式不正确。现在,它是一个由1个项目组成的数组,当应为["A, B"]

时为字符串["A", "B"]

如果您无法修复该列中的数据,则可以在select中围绕您的类型添加一些其他函数调用

Select unnest(string_to_array(jsonb_array_elements(t.metadata -> 'Type'), ', ')) as type, count(DISTINCT t.hash)
FROM table AS t
GROUP BY type