Jak poprosić o tablicę JSONB

0

Pytanie

Mam tabela (zamówień) z jsonb[] kolumna z nazwą steps w bazie danych Postgresql.

Muszę tworzyć zapytania SQL do wyboru rekordów, w których Krok 1, Krok 2 i krok 3 mają status udany

[
 {
  "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"
  }
]

id | nazwa | kroki struktury tabeli (jsonb)

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

Najlepsza odpowiedź

1

"Normalizacji" steps do listy elementów JSON i sprawdź, czy każdy z nich "status":"success". Przy okazji, twój przykład nie jest prawidłową JSON. Wszystkie => należy wymienić na : i przecinek brakuje.

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

Czy możemy korzystać z tego wniosek z REJESTREM...WTEDY... Artykuł O ZAKOŃCZENIU ? Na przykład. jeśli krok 1"," Krok 2", "Krok 3" pomyślny, zamówienie ma status "Odrzucony".
Timothy94

Tak, oczywiście. Istnieje kilka opcji. Jednak staram się robić zapytania, jak to możliwe, które zapewniają deklaracyjne i unikać twardego kodowania części. Ale tak naprawdę to kwestia gustu.
Stefanov.sm
0

Można użyć operacji "Zawierać wartość JSON" do sprawdzania stanu "istnieje" lub "nie".

DEMONSTRACJA

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

Co zrobić, jeśli liczba kroków wcześniej nieznany?
Stefanov.sm

W innych językach

Ta strona jest w innych językach

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