如何统计JSON列中嵌套数组voucherList的去重计数
统计JSON列中voucherList的去重凭证数量
先修正JSON格式
你提供的JSON示例存在语法错误,正确的对象格式应该是这样(外层用{}而非[]):
{"billinfo": [ { "sortKey": "z", "voucherList": [ "021121", "021122", "021123" ] } ] }
以及
{"billinfo": [ { "sortKey": "z", "voucherList": [ "004077" ] }, { "sortKey": "z", "voucherList": [ "004076" ] } ] }
针对不同数据库的实现方案
假设你的表名为your_table,JSON列名为record,以下是主流数据库的查询语句:
PostgreSQL(推荐用jsonb类型)
SELECT COUNT(DISTINCT voucher) FROM your_table, jsonb_array_elements(record->'billinfo') AS bill, jsonb_array_elements(bill->'voucherList') AS voucher;
- 逻辑:先展开
billinfo数组得到每个账单对象,再展开每个对象里的voucherList数组得到单个凭证编号,最后对所有编号去重计数。
MySQL 8.0+
SELECT COUNT(DISTINCT voucher) FROM your_table, JSON_TABLE( record, '$.billinfo[*].voucherList[*]' COLUMNS (voucher VARCHAR(20) PATH '$') ) AS jt;
- 逻辑:用
JSON_TABLE直接解析嵌套的JSON数组,把所有凭证编号提取到虚拟表,再去重统计数量。
注意事项
- 必须保证JSON格式合法,否则会导致解析失败
- 不同数据库的JSON处理函数有差异,需根据实际使用的数据库调整语句
内容的提问来源于stack exchange,提问作者Diksha Chaudhary
相关产品推荐
相关产品推荐

