【问题标题】:Selecting from two different JSON columns resulting in n^2 rows instead of n从两个不同的 JSON 列中选择导致 n^2 行而不是 n
【发布时间】:2020-09-01 14:13:02
【问题描述】:

我有一个这样的 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

casesdeaths 的长度均为 51,但上面的查询给出了 2601 (51^2) 行,如下所示:

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

【问题讨论】:

  • 你需要告诉他们如何加入,就像普通的桌子一样。

标签: sql arrays json postgresql join


【解决方案1】:

一种选择是取消嵌套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

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

Demo on DB Fiddle.

样本数据:

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

结果:

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

【讨论】:

  • 非常感谢!
【解决方案2】:

为了文档,这也有效:

SELECT json_array_elements_text(info->'deaths') AS deaths, json_array_elements_text(info->'cases') AS cases
FROM covid_json

【讨论】:

    猜你喜欢
    • 2016-07-01
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    • 2014-08-24
    • 2020-07-10
    • 2021-01-11
    • 2013-02-06
    • 1970-01-01
    相关资源
    最近更新 更多