postgresql - 在postgresql中对jsonb进行排序

标签 postgresql jsonb

我在 postgresql 中有一个 jsonb 列,其中数据存储为

CREATE TABLE foo(response jsonb);
INSERT INTO foo VALUES
('[{"qs":"field1", "ans":"a"},{"qs":"field2", "ans":"1"}]' :: jsonb),
('[{"qs": "field1", "ans": "d"},{"qs": "field2", "ans": "4"}]' :: jsonb),
('[{"qs": "field1", "ans": "b"},{"qs": "field2", "ans": "3"}]' :: jsonb),
('[{"qs": "field1", "ans": "e"},{"qs": "field2", "ans": "2"}]' :: jsonb)

我需要根据值“field1”对键“ans”值进行排序以生成结果,

[{"qs": "field1", "ans": "a"}, {"qs": "field2", "ans": "1"}]
[{"qs": "field1", "ans": "b"}, {"qs": "field2", "ans": "3"}]
[{"qs": "field1", "ans": "d"}, {"qs": "field2", "ans": "4"}]
[{"qs": "field1", "ans": "e"}, {"qs": "field2", "ans": "2"}]


field1 | field2
  a    |    1
  b    |    3
  d    |    4
  e    |    2

也根据'field2'排序,

[{"qs": "field1", "ans": "a"}, {"qs": "field2", "ans": "1"}]
[{"qs": "field1", "ans": "e"}, {"qs": "field2", "ans": "2"}]
[{"qs": "field1", "ans": "b"}, {"qs": "field2", "ans": "3"}]
[{"qs": "field1", "ans": "d"}, {"qs": "field2", "ans": "4"}]

field1 | field2
  a    |    1
  e    |    2
  b    |    3
  d    |    4

有没有办法在 postgresql 中实现这个???

最佳答案

demo:db<>fiddle


不知道你要不要:

A) 按原样对 JSON 对象进行排序:

| response                                                     |
| :----------------------------------------------------------- |
| [{"qs": "field1", "ans": "a"}, {"qs": "field2", "ans": "1"}] |
| [{"qs": "field1", "ans": "b"}, {"qs": "field2", "ans": "3"}] |
| [{"qs": "field1", "ans": "d"}, {"qs": "field2", "ans": "4"}] |
| [{"qs": "field1", "ans": "e"}, {"qs": "field2", "ans": "2"}] |

排序json输出的查询:

SELECT
    *
FROM foo
ORDER BY response -> 0 -> 'ans'

只需查询 ORDER BY 子句中的 ans 值。如果您想按 field2 排序,您需要将 0 更改为 1(并且可能将其转换为 int 类型code>: ORDER BY (response -> 1 ->> 'ans')::int)


B) 您只想对 ans 值进行排序:

field1 | field2
:----- | -----:
a      |      1
b      |      3
d      |      4
e      |      2

排序 ans 值的查询:

SELECT 
    response -> 0 ->> 'ans' AS field1,
    (response -> 1 ->> 'ans')::int AS field2
FROM
    foo
ORDER BY 1

通过解析数组创建两列。 field1 是 JSON 数组的第一个元素,field2 是第二个元素(索引 01)。之后您可以对这些列进行正常排序。

关于postgresql - 在postgresql中对jsonb进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58009640/

相关文章:

postgresql - 如何从 jsonb 返回对象数组?

PostgreSQL - JSONB 列的 GROUP_CONCAT

postgresql - 在 Postgres 中修改 JSONB 字段的数据类型

postgresql - Postgres 动态 COPY 语句

ruby-on-rails - 为什么在尝试使用 postgresql 作为 RoR 中的数据库时会出现此错误?

sql - 简单的 jsonb_agg ORDER BY

sql - JSONB:用作表达式的子查询返回的多行

sql - 在 Postgres 中转义类似关键字的列名

sql - WHERE 与 PARTITION BY postgres 一起使用

arrays - PostgreSQL 索引 JSONB 数组