0

看看我的 JSONB 字段

select internet_address from resporg_account_ids where id=3
=> [{"zone": "us-central1", "address": "127.0.0.1", "reserve": true}, {"zone": "us-east1", "address": "127.0.0.10", "reserve": true}

]

相关jsonb查询

select * from resporg_account_ids where internet_address <@ '[{"zone": "us-central1", "address": "127.0.0.1", "reserve": true}]'::jsonb;

和这个

select * from resporg_account_ids where internet_address <@ '{"zone": "us-central1", "address": "127.0.0.1", "reserve": true}'::jsonb;

而且我在输出控制台中看不到任何结果。

另外,我想根据单个键查询它...

喜欢

select * from resporg_account_ids where internet_address->>address="127.0.0.1" and internet_address->>reserve=true

最后,

jsondb=# select version();
                                                    version
---------------------------------------------------------------------------------------------------------------
 PostgreSQL 9.5.10 on x86_64-apple-darwin17.2.0, compiled by Apple LLVM version 9.0.0 (clang-900.0.38), 64-bit
(1 row)

笔记:

第 1 部分:已解决感谢@mroman 指出这一点。

4

2 回答 2

0

您应该对对象的 json 键使用单引号:

select * from resporg_account_ids where internet_address->>'address'='127.0.0.1'

在第二部分中,您尝试将文本与布尔值进行比较,因为->>返回文本。所以你需要转换类型:

... and (internet_address->>'reserve')::boolean is true
于 2018-06-17T11:08:38.900 回答
0

CTE来救援...

with intaddr as (select jsonb_array_elements(internet_address) internetaddr from resporg_account_ids)
select * from intaddr where internetaddr->>'address' = '127.0.0.1' and (internetaddr->>'reserve')::boolean=true;
于 2018-06-18T04:13:56.480 回答