Eu tenho uma tabela no Postgres 9.6 db que está estruturada assim:
Table "public.pricings"
Column | Type | Modifiers
---------------------------+-----------------------------+-------------------------------------------------------
id | integer | not null default nextval('pricings_id_seq'::regclass)
unconfirmed_matrix_prices | jsonb | not null default '"{}"'::jsonb
Sou novo no uso do jsonb.
Eu gostaria de procurar por quaisquer unconfirmed_matrix_prices que estejam vazios (ou seja, o padrão). Vejo que posso fazer algo assim:
solar_dev=# select count(*) from json_object_keys('{"f1":1,"f2":2}');
count
-------
2
(1 row)
Existe uma maneira de fazer uma frase where onde json_object_keys é igual a 0? Eu sei um pouco de uma maneira desleixada - Existe uma maneira melhor?
Você pode simplesmente verificar se o valor é o valor padrão, por exemplo:
Observe que um valor jsonb vazio deve ser escrito como '{}', portanto, o valor padrão não é um jsonb vazio. Isso pode ser problemático com algum tipo de consulta, por exemplo, usando a função
jsonb_each().
que sugiro para corrigir o valor padrão da seguinte maneira:Esta é uma ideia muito ruim.
Isso não é armazenar um objeto vazio. Isso está armazenando um literal de string JSONB de
"{}"
. Você nunca quer isso. Você normalmente deseja confiná-lo a um subtipo específico, algo assim ..Você também normalmente não quer torná-lo não-nulo. Prefiro ter nullable e evitar objetos vazios se precisar desse tipo de restrição. Isso simplifica sua consulta substancialmente (como visto aqui).