You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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;

逻辑说明:

  1. json_array_elements(option_tb->'options') 将options数组拆分为单独的行记录,每个行对应数组中的一个元素
  2. arr_obj->'object'->>'someText' 从每个数组元素中提取someText的文本值(->>用于获取无引号的纯文本)
  3. 通过COUNT(DISTINCT ...)统计去重后的someText数量
  4. 过滤条件确保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;

逻辑说明:

  1. 先拆分options数组为单行记录
  2. json_to_record(arr_obj) 将每个数组元素(包含object的对象)映射为结构化行,指定someText为文本类型
  3. 直接通过obj.someText访问目标属性,再统计去重数量

内容的提问来源于stack exchange,提问作者Capfer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 02:27:44