首页 > 解决方案 > 从两个不同的 JSON 列中选择导致 n^2 行而不是 n

问题描述

我有一个这样的 JSON 文档:

{"cases":[1983,2188, etc.],"deaths":[78,84, etc.]});

我正在尝试使用以下方法并排查看它们:

SELECT dd::numeric AS deaths, cc::numeric AS cases
FROM covid_json, json_array_elements_text(info->'deaths') dd, json_array_elements_text(info->'cases') cc

cases并且deaths两者的长度都是 51,但上面的查询给出了 2601 (51^2) 行,例如:

在此处输入图像描述

我应该怎么做才能防止这些值在每一行中重复?

标签: sqlarraysjsonpostgresqljoin

解决方案


一种选择是取消嵌套with ordinality。这会为每个元素添加一个索引号,然后您可以使用它join

select d.deaths, c.cases
from covid_json cj
cross join lateral json_array_elements(cj.info -> 'cases') with ordinality as d(deaths, rn)
inner join lateral json_array_elements(cj.info -> 'deaths') with ordinality as c(cases, rn) 
    on c.rn = d.rn

这假设两个数组具有相同数量的元素,如您的问题中所述。

DB Fiddle 上的演示

样本数据:

| 信息 |
| :------------------------------------------------ - |
| {“案例”:[1983, 2188, 2615],“死亡”:[78,84, 87]} |

结果:

死亡 | 案例
:----- | :----
1983 | 78   
第2188章 84   
2615 | 87   

推荐阅读