【发布时间】:2019-02-08 08:58:05
【问题描述】:
我有一个名为 houses 的表,其中有一个名为 jsonb 的列 details 。 detailsjsonb列的结构是:
{
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
请注意有null、null,因为至少有两行没有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