在我们的数据库中,一个 JSONB 列包含一个对象,该对象具有一个字符串编码的 JSON 对象的属性。我需要在查询期间反序列化这个字符串并检查它的值。
create table datas (id int, data jsonb);
insert into datas (id, data) values (1, '{"key1": "{\"foo\": \"bar\"}"}');
我可以选择字符串值,但随后将其转换为 JSONB 对象不起作用。这些查询都为foo
.
select data->'key1'->'foo' from datas;
select to_json(data->'key1')->'foo' from datas;
select (data->'key1')::jsonb->'foo' from datas;
dbfiddle:https ://dbfiddle.uk/?rdbms=postgres_9.6&fiddle=9c0a9f7f1323a35051daba5177e52f57
您需要
text
使用->>
运算符提取值,然后才能将其转换回 ajson
orjsonb
值:但正确的解决方案是不要以每次访问时都需要来回转换的方式存储值。
这是因为当您将
json
(orjsonb
) 转换为所有引号时,text
所有引号都会保留。如果您'"{\"foo\": \"bar\"}"'
转换回 JSON,它仍然是单个 JSON 字符串,而不是键/值对。看这里