【问题标题】:postgresql, select multiple json_array_elements works so weridpostgresql,选择多个 jsonb_array_elements 工作很奇怪
【发布时间】:2017-06-30 23:20:03
【问题描述】:

我想使用 json_array_elements 来扩展 json 数组。但它的工作原理很奇怪。请看下文。

选择json_array_elements('[1, 2]') 作为a,json_array_elements('[2, 3, 4]') 作为b;

a | b
---+---
1 | 2
2 | 3
1 | 4
2 | 2
1 | 3
2 | 4 

(6 行)

选择json_array_elements('[1, 2]')作为a,json_array_elements('[2, 3]')作为b;

a | b
---+---
1 | 2
2 | 3

(2 行)

似乎当数组的长度相等时,出现了问题。 谁能告诉我,为什么会这样。

【问题讨论】:

标签: json postgresql select


【解决方案1】:

PostgreSQL 重复每个列表,直到两者恰好同时在末尾。

换句话说,结果列表的长度是输入列表长度的least common multiple

这种行为确实很奇怪,在 PostgreSQL v10 中会有所改变:

select json_array_elements('[1, 2]') as a, json_array_elements('[2, 3, 4]') as b;
 a | b
---+---
 1 | 2
 2 | 3
   | 4
(3 rows)

来自commit message

虽然将 SRF 评估移至 ProjectSet 将允许保留旧的 当多个 SRF 存在于一个中时的“最小公倍数”行为 targetlist(即继续返回行,直到所有 SRF 都在 他们的输入),我们决定只返回行直到 所有 SRF 都已用尽,对于已用尽的 SRF 返回 NULL。我们 认为以前的行为太令人困惑、出乎意料并且实际上 不是特别有用。

【讨论】:

  • 哦,这就是为什么。非常感谢。而当 PostgreSQL 添加这个更改时,它会在 PostgreSQL 10 中吗?
  • 是的。我已在答案中添加了有关此的详细信息。
猜你喜欢
  • 2014-08-15
  • 2011-05-07
  • 1970-01-01
  • 1970-01-01
  • 2016-07-10
  • 2019-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多