Comment la Requête D'un tableau de JSONB

0

La question

J'ai de la table (les ordres) avec jsonb[] colonne nommée steps dans Postgres db.

J'ai besoin de créer une requête SQL pour sélectionner les enregistrements où Etape 1 et Etape 2 et Etape 3 a le statut de succès

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

structure de la table id | nom | étapes (jsonb)

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

La meilleure réponse

1

De "normalisation" steps dans une liste de JSON éléments et vérifier si chacun d'entre eux a "status":"success". BTW, ton exemple n'est pas valide JSON. Tous => besoin d'être remplacées par : et une virgule est manquante.

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

Peut-on utiliser cette requête avec des CAS...ALORS... FIN de la clause ? Pour ex. si 1','etape n ° 2','Etape 3' est le succès de commande "Devilered" statut
Timothy94

Oui, bien sûr. Il y a plusieurs options. J'essaie toutefois de faire des requêtes comme déclarative que possible et d'éviter de coder en dur de détails. Mais c'est une question de goût en fait.
Stefanov.sm
0

Vous pouvez utiliser la valeur JSON contient de l'opération pour vérifier l'état existent ou pas

Démo

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

Que faire si le nombre d'étapes est inconnue d'avance?
Stefanov.sm

Dans d'autres langues

Cette page est dans d'autres langues

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