Como Consultar uma matriz de JSONB

0

Pergunta

Eu tenho a tabela (encomendas) com jsonb[] coluna chamada steps no Postgres db.

Eu preciso criar consulta SQL para selecionar os registros onde o Passo 1 e o Passo 2 e o Passo 3 tem status de sucesso

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

estrutura da tabela id | nome | passos (jsonb)

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

Melhor resposta

1

'Normalizar' steps em uma lista de JSON itens e verificar se cada um deles tem "status":"success". BTW, o seu exemplo não é válido JSON. Todos => precisa ser substituído com : e um vírgula está faltando.

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 usar essa consulta com o CASO...THEN... END cláusula ? Para o ex. se o Passo 1','Passo 2','Passo 3' é sucesso de ordem "Devilered" status
Timothy94

Sim, com certeza. Existem várias opções. Eu estou tentando, no entanto, fazer consultas como declarativa possível e evitar rígido codificação dos detalhes. Mas isso é uma questão de gosto pessoal, na verdade.
Stefanov.sm
0

Você pode usar JSON valor conter operação para a condição de verificação da existência ou não de

Demonstração

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

O que acontece se o número de passos é desconhecido antecipadamente?
Stefanov.sm

Em outros idiomas

Esta página está em outros idiomas

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