Сортировка jsonb в postgresql - PullRequest
       12

Сортировка jsonb в postgresql

0 голосов
/ 19 сентября 2019

У меня есть столбец jsonb в postgresql, в котором данные хранятся как

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)

Мне нужно отсортировать значение ключа 'ans' на основе значения 'field1', чтобы сгенерировать результат,

[{"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 ???

1 Ответ

2 голосов
/ 19 сентября 2019

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'

Просто запросите значение ans в предложении ORDER BY.Если вы хотите отсортировать по field2, вам нужно изменить 0 на 1 (и, возможно, привести его к типу int: 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 - второй (индексы 0 и 1).После этого вы можете заказать эти столбцы обычно.

...