【问题标题】:why is my JSONB query no returning any result为什么我的 JSONB 查询没有返回任何结果
【发布时间】:2018-06-17 08:51:26
【问题描述】:

看看我的 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 指出。

【问题讨论】:

  • a &lt;@ b 表示 A 包含在 B 中,而不是 B 包含在 A 中。您可能需要翻转参数或使用 @&gt;。但我不确定这些操作数是否可以用于数组。

标签: postgresql postgresql-json


【解决方案1】:

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

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

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

... and (internet_address->>'reserve')::boolean is true

【讨论】:

  • views_production=# select * from resporg_account_ids where internet_address-&gt;&gt;'address'="127.0.0.1" views_production-# ; ERROR: column "127.0.0.1" does not exist LINE 1: ...rg_account_ids where internet_address-&gt;&gt;'address'="127.0.0.1...
  • @Ratatouille,对不起,我的错误,刚刚修复它。字符串使用单引号而不是双引号:internet_address-&gt;&gt;'address'='127.0.0.1' 双引号用于引用包含大写字母的表属性。
【解决方案2】:

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;

【讨论】:

    猜你喜欢
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多