Jak Do Dotazu pole JSONB

0

Otázka

Mám stolu (objednávky) s jsonb[] sloupec s názvem steps v Postgres db.

Potřebuji vytvořit SQL dotazu pro výběr záznamů, kde Krok 1 a Krok 2 a Krok 3 má úspěch stav

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

strukturu tabulky id | jméno | kroky (jsonb)

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

Nejlepší odpověď

1

"Normalizace" steps do seznamu JSON položky a zkontrolujte, zda každý jeden z nich má "status":"success". BTW. váš příklad není platný JSON. Všechny => muset být nahrazen : a čárka chybí.

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

Můžeme použít tento dotaz s CASE...PAK... KONEC doložku ? Pro ex. pokud Krok 1','2','Step3 je úspěch, aby se "Devilered" stav
Timothy94

Ano, pro jistotu. Existuje několik možností. Snažím se však, aby se dotazy, jak deklarativní, jak je to možné a vyhnout hard-kódování informací. Ale to je věc osobního vkusu.
Stefanov.sm
0

Můžete použít JSON hodnotu, obsahují operace pro podmínka existuje, nebo ne

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

Co když počet kroků není znám předem?
Stefanov.sm

V jiných jazycích

Tato stránka je v jiných jazycích

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