Cómo consultar una matriz de JSONB

0

Pregunta

Tengo una tabla (órdenes) con jsonb[] columna denominada steps en Postgres db.

Necesito crear una consulta SQL para seleccionar los registros en los que el paso 1 y el Paso 2 y Paso 3 tiene el estado de éxito

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

estructura de la tabla id | nombre | pasos (jsonb)

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

Mejor respuesta

1

'Normalizar' steps en una lista de JSON elementos y comprobar si cada uno de ellos tiene "status":"success". Por CIERTO, tu ejemplo no es válido JSON. Todos => necesitan ser reemplazados con : y una coma que falta.

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

Podemos utilizar esta consulta con el CASO...ENTONCES... FIN de la cláusula ? Para el ex. si Step1','Step2','Step3' es el éxito de la orden ha "Devilered" estado de
Timothy94

Sí, seguro. Hay varias opciones. Estoy intentando sin embargo, para hacer consultas como declarativa como sea posible y evitar codificar de detalles. Pero esto es una cuestión de gusto personal, en realidad.
Stefanov.sm
0

Usted puede usar JSON valor contener operación para comprobar el estado existe o no

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

¿Qué pasa si el número de pasos es desconocido por adelantado?
Stefanov.sm

En otros idiomas

Esta página está en otros idiomas

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