如何计算以下 JSON 中的元素数
Posted
技术标签:
【中文标题】如何计算以下 JSON 中的元素数【英文标题】:How to count number of elements in the following JSON 【发布时间】:2020-03-09 05:21:42 【问题描述】:我的 Metabase 表中有一个列,其中列条目如下所示:
“text_fields”: “Weight”: “:optional=>true, :priority=>4, :index=>false” , “checkbox_fields”: , “dropdown_fields”: “Brand Name”: “:optional=>false, :priority=>1, :index=>false, :options=>[“Non Branded”]”
我想得到一个净计数 文本字段 复选框字段 下拉字段
在这种情况下,所需的答案将是:2(1 个文本字段 + 0 个复选框字段 + 1 个下拉字段)
【问题讨论】:
使用json_each function 然后只使用count()
结果由key
分组/过滤
嗨@Abelisto,谢谢您的回答。也许我用错了这个函数,但我也希望所有其他列也存在。函数 json each 在 from 子句中工作,如下所示: Select * from json each(json) 但我的字段是大表中的一列,我也想要所有其他数据。还有其他解决方案吗?这给了我一个语法错误。
@IshanPurohit 您的问题缺少create table
详细信息,因此我们不知道表结构
@IshanPurohit 您的 JSON 无效 - 您能否使用“编辑帖子”并修复您输入的示例数据?
@IshanPurohit (values(1::int, '"a": "x":1, "b": '::json)) select *, (select count(*) from json_each(j) where key in ('a', 'b') and not value::jsonb = ''::jsonb) from t;
请注意转换为jsonb
类型的值,因为json
类型没有比较运算符。
【参考方案1】:
使用jsonb_each
迭代对象键/值,使用jsonb_object_keys
仅提取键。
示例(包含示例数据):
SELECT * FROM mytable ;
mycolumn
---------------------------------------------------------------------------------------------
"text_fields": "Weight": 1, "checkbox_fields": , "dropdown_fields": "Brand Name": 1
(1 row)
SELECT *,
(SELECT sum((SELECT count(*) FROM jsonb_object_keys(v1)))
FROM jsonb_each(mycolumn) AS j1(k1,v1)
WHERE k1 IN ('text_fields', 'checkbox_fields', 'dropdown_fields')
) AS mytotal
FROM mytable;
mycolumn | mytotal
---------------------------------------------------------------------------------------------+---------
"text_fields": "Weight": 1, "checkbox_fields": , "dropdown_fields": "Brand Name": 1 | 2
(1 row)
【讨论】:
以上是关于如何计算以下 JSON 中的元素数的主要内容,如果未能解决你的问题,请参考以下文章