Come Per la Query in un array di JSONB

0

Domanda

Ho la tabella (ordini) con jsonb[] colonna denominata steps nel db Postgres.

Ho bisogno di creare una query SQL per selezionare record in cui la Fase 1 e la Fase 2 e la Fase 3 è stato di successo

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

struttura della tabella id | nome | passaggi (jsonb)

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

Migliore risposta

1

'Normalizzare' steps in un elenco di oggetti JSON e verificare se ogni uno di loro ha "status":"success". BTW il tuo esempio non è valido JSON. Tutti => devono essere sostituiti con : e una virgola mancante.

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

Possiamo utilizzare questa query con il CASO...QUINDI... FINE clausola ? Per ex. se 1','Fase 2','3' è successo ordine è "Devilered" stato
Timothy94

Sì, di sicuro. Ci sono diverse opzioni. Sto cercando però di creare query come dichiarativa possibile e di evitare hard-codifica dei dettagli. Ma questa è una questione di gusto personale, in realtà.
Stefanov.sm
0

È possibile utilizzare JSON valore contenere operazione per controllare la condizione dell'esistenza o meno di

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

Che cosa succede se il numero di passi è sconosciuto anticipo?
Stefanov.sm

In altre lingue

Questa pagina è in altre lingue

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