如何在PostgreSQL中统计嵌套JSON里someText的去重值?
统计嵌套JSON对象中someText属性的去重值数量
你的原查询存在两个核心问题:
- 没有展开
options数组,仅判断了数组第一个元素是否存在,无法遍历所有数组元素中的someText值 - 用
COUNT(distinct option_tb)统计的是整个JSON对象的去重数,而非someText属性的去重值数量
针对你的JSON结构,需要先将数组拆分为单独行,再提取目标属性后去重计数,以下是两种可行的实现方式:
方法一:直接通过JSON路径提取
SELECT COUNT(DISTINCT arr_obj->'object'->>'someText') AS uniqueOptions FROM tableT, json_array_elements(option_tb->'options') AS arr(arr_obj) WHERE option_tb->'options' IS NOT NULL AND arr_obj->'object'->>'someText' IS NOT NULL;
逻辑说明:
json_array_elements(option_tb->'options')将options数组拆分为单独的行记录,每个行对应数组中的一个元素arr_obj->'object'->>'someText'从每个数组元素中提取someText的文本值(->>用于获取无引号的纯文本)- 通过
COUNT(DISTINCT ...)统计去重后的someText数量 - 过滤条件确保
options数组存在且someText不为空
方法二:使用json_to_record映射为结构化数据
SELECT COUNT(DISTINCT obj.someText) AS uniqueOptions FROM tableT, json_array_elements(option_tb->'options') AS arr(arr_obj), json_to_record(arr_obj) AS obj(someText text) WHERE option_tb->'options' IS NOT NULL AND obj.someText IS NOT NULL;
逻辑说明:
- 先拆分
options数组为单行记录 json_to_record(arr_obj)将每个数组元素(包含object的对象)映射为结构化行,指定someText为文本类型- 直接通过
obj.someText访问目标属性,再统计去重数量
内容的提问来源于stack exchange,提问作者Capfer
相关产品推荐
相关产品推荐

