Запрос данных по пустому json или с данными об ошибках - PullRequest
0 голосов
/ 08 мая 2019

У меня есть таблица в Postgresql, в которой есть столбец jsonb.Этот столбец может иметь 3 типа данных в следующей структуре:

  1. [], если результат пустой;
  2. [{"items": [{"name": "item1", "value": "value1", "messages": []}]}]"
  3. [{"items": [{"name": "error", "value": "some error", "messages": []}]}]

Если первый элемент не является ошибкой, я должен показать данные.А также у меня есть интерфейс, чтобы получить все ошибки.Я использую COUNT WHERE FILTER, чтобы получить счетчик пустых и ошибок, и он работает.

Это пример запроса:

SELECT COUNT(*) FILTER (WHERE t1.my_column = '[]' OR items -> 'items' -> 0 ->> 'name' = 'error') --This works
FROM my_table t1
LEFT JOIN jsonb_array_elements(CAST(t1.my_column AS jsonb)) AS items ON TRUE

Но когда я пытаюсь использовать его надругой запрос возвращает cannot extract elements from an object:

SELECT t1.id, t1.column1, ...
FROM my_table t1
LEFT JOIN jsonb_array_elements(CAST(t1.my_column AS jsonb)) AS items ON TRUE
WHERE t1.my_column <> '[]' --This works
OR items -> 'items' -> 0 ->> 'name' <> 'error' --This doesn't

Кажется, он не может извлечь данные из пустого массива, но на самом деле я не знаю, как заставить его работать в обоих случаях.

Может ли кто-нибудь мне помочь?

1 Ответ

0 голосов
/ 08 мая 2019

Ваш второй запрос ссылается на псевдоним таблицы («запись»), а не на фактическое значение, возвращаемое jsonb_array_elements.

Вам нужно изменить это на:

SELECT * 
FROM my_table t1
  LEFT JOIN jsonb_array_elements(t1.my_column) with ordinality AS items(item) ON true
where item.item -> 'items' -> 0 ->> 'name' <> 'error'

Обратите внимание, что условие where на внешней соединяемой таблице превращает ваше внешнее соединение обратно во внутреннее соединение. Это фактически так же, как

SELECT * 
FROM my_table t1
  JOIN jsonb_array_elements(t1.my_column) AS items(item) 
    ON items.item -> 'items' -> 0 ->> 'name' <> 'error'
...