【问题标题】:Get values filtered by jsonb key获取由 jsonb 键过滤的值
【发布时间】:2019-02-08 08:58:05
【问题描述】:

我有一个名为 houses 的表,其中有一个名为 jsonb 的列 detailsdetailsjsonb列的结构是:

{
  owner_id: TEXT,
  owner_name: TEXT,
  offers: [{ offer_id: TEXT, offer_value_id: TEXT, offer_value_name: TEXT }]
}

请注意,有时优惠可能完全为空,例如offers: []

所以,现在我有一个查询,可以让我获得由owner_name 订购的所有不同房主。它看起来像这样:

SELECT distinct ("details"->>'owner_id') as "identifier", "details"->>'owner_name' as "name" 
FROM houses 
order by "details"->>'owner_name' asc 

我想做类似的事情,但现在我想获取所有不同的报价值,但只是针对特定的报价 ID。以下是一些示例数据,但我期望的是:

身份证,详情

1, { owner_id: '1', owner_name: 'john', offers: [] }
2, { owner_id: '2', owner_name: 'charles', offers: [ { offer_id: '1', offer_value_id: '1', offer_value_name: 'offer1'}, { offer_id: '2', offer_value_id: '2', offer_value_name: 'offer2'}] }
3, { owner_id: '3', owner_name: 'melissa', offers: [ { offer_id: '2', offer_value_id: '5', offer_value_name: 'a offer 3'} ]
4, { owner_id: '3', owner_name: 'melissa', offers: [ { offer_id: '6', offer_value_id: '8', offer_value_name: 'offer10'} ]

所以,假设我想在 offer_id 为 '2' 时获取所有不同的报价值 ID 和值名称。结果是:

identifier (this would be offer_value_id), name (this would be offer_value_name)
'5', 'a offer 3'
'2', 'offer2'
null, null

请注意有nullnull,因为至少有两行没有offer_id 为1 的任何offer,我也想得到它。另外,请注意这些值是按offer_value_name NULL 排序的。

我尝试了以下方法,但不起作用:

SELECT distinct ("details"->>'offers'->>'offer_value_id') as "identifier", ("details"->>'offers'->>'offer_value_name') as "name" 
    FROM houses 
    WHERE "details"->>'offers'->>'offer_id' = '2'
    order by "details"->>'offers'->>'offer_value_name' asc 

而且我认为这种方法行不通,因为如果details offer没有offer_id,我也希望它选择NULL,这只会将其过滤掉。

【问题讨论】:

    标签: sql postgresql jsonb


    【解决方案1】:

    我认为这可行:

    SELECT DISTINCT "offers"->>'offer_value_id' as "identifier", "offers"->>'offer_value_name' as "name"
    FROM houses
    LEFT JOIN jsonb_array_elements("details"->'offers') "offers" ON "offers"->>'offer_id' = '1';
    ORDER BY "offers"->>'offer_value_name' NULLS LAST
    

    您知道您想要获取所有记录,无论是否存在 id 为 1 的商品,这就是您执行 LEFT JOIN 的原因。

    这里要注意的另一件事是jsonb_array_elements,它很有帮助,因为它将 json 扩展为一组 json 值。这样您就可以像访问顶级字段一样访问offers

    【讨论】:

      猜你喜欢
      • 2021-11-23
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 2018-08-02
      • 2022-10-19
      • 2015-03-28
      • 1970-01-01
      相关资源
      最近更新 更多