Как запросить массив JSONB

0

Вопрос

У меня есть таблица (заказы) с jsonb[] столбец с именем steps в базе данных Postgres.

Мне нужно создать SQL-запрос для выбора записей, в которых Шаг 1, Шаг 2 и шаг 3 имеют статус успешного

[
 {
  "step_name"=>"Step1",
  "status"=>"success",
  "timestamp"=>1636120240
  },
 {
  "step_name"=>"Step2",
  "status"=>"success",
  "timestamp"=>1636120275
 },
 {
  "step_name"=>"Step3",
  "status"=>"success",
  "timestamp"=>1636120279
 },
 {
  "step_name"=>"Step4", 
  "timestamp"=>1636120236
  "status"=>"success"
  }
]

идентификатор | имя | шаги структуры таблицы (jsonb)

arrays jsonb postgresql sql
2021-11-18 10:35:40
2

Лучший ответ

1

"Нормализовать" steps в список элементов JSON и проверьте, есть ли у каждого из них "status":"success". Кстати, ваш пример не является допустимым JSON. Все => необходимо заменить на : и запятая отсутствует.

select id, name from orders
where
(
 select bool_and(j->>'status' = 'success') 
 from jsonb_array_elements(steps) j
 where j->>'step_name' in ('Step1','Step2','Step3') -- if not all steps but only these are needed
);
2021-11-18 13:18:38

Можем ли мы использовать этот запрос с РЕГИСТРОМ...ТОГДА... Пункт ОБ ОКОНЧАНИИ ? Например. если шаг 1"," Шаг 2", "Шаг 3" успешен, заказ имеет статус "Отклонен".
Timothy94

Да, конечно. Есть несколько вариантов. Однако я стараюсь делать запросы как можно более декларативными и избегать жесткого кодирования деталей. Но на самом деле это вопрос личного вкуса.
Stefanov.sm
0

Вы можете использовать операцию "Содержать значение JSON" для проверки состояния "существует" или "нет".

ДЕМОНСТРАЦИЯ

select
  *
from
  test
where
  steps @> '[{"step_name":"Step1","status":"success"},{"step_name":"Step2","status":"success"},{"step_name":"Step3","status":"success"}]'
2021-11-18 13:00:24

Что делать, если количество шагов заранее неизвестно?
Stefanov.sm

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

Популярное в этой категории

Популярные вопросы в этой категории