Cum Pentru a Interoga o serie de JSONB

0

Problema

Am de masă (comenzi) cu jsonb[] coloana nume steps în Postgres db.

Am nevoie de a crea SQL de interogare pentru a selecta înregistrările în cazul în Pasul 1 și Pasul 2 și Pasul 3-a stare de succes

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

structură de tabel id | nume | etape (jsonb)

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

Cel mai bun răspuns

1

'Normalizarea' steps într-o listă de obiecte JSON și verificați dacă fiecare dintre ele are "status":"success". BTW exemplul tau nu este valid JSON. Toate => trebuie să fie înlocuite cu : și o virgulă lipsă.

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

Putem folosi această interogare cu CAZUL...APOI... END clauza ? De ex. dacă Pasul 1','2','Pasul 3' este un succes pentru a "Devilered" statutul
Timothy94

Da, sigur. Există mai multe opțiuni. Am încercat totuși să facă interogări ca declarativ posibil și pentru a evita hard-codare de detalii. Dar aceasta este o chestiune de gust personal, de fapt.
Stefanov.sm
0

Puteți utiliza JSON valoarea conțin funcționare pentru a verifica starea exista sau nu

Demo

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

Ce se întâmplă dacă numărul de pași este cunoscută în avans?
Stefanov.sm

În alte limbi

Această pagină este în alte limbi

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