我有一个名为houses
的表,该表具有一个名为jsonb
的{{1}}列。 details
jsonb列的结构为:
details
请注意,有时报价可能是完全空白的,例如{
owner_id: TEXT,
owner_name: TEXT,
offers: [{ offer_id: TEXT, offer_value_id: TEXT, offer_value_name: TEXT }]
}
因此,现在我有一个查询,可让我获取offers: []
排序的所有不同房屋所有者。看起来像这样:
owner_name
我想做类似的事情,但是现在我想获得所有不同的要约值,但只针对特定的offer_id。以下是一些示例数据,但我希望得到以下结果:
id,详细信息
SELECT distinct ("details"->>'owner_id') as "identifier", "details"->>'owner_name' as "name"
FROM houses
order by "details"->>'owner_name' asc
因此,假设我想在offer_id为'2'时获取所有不同的要约值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'} ]
请注意,这里有identifier (this would be offer_value_id), name (this would be offer_value_name)
'5', 'a offer 3'
'2', 'offer2'
null, null
,null
,因为在有offer_id为null
的地方,至少有两行没有任何要约,我也想得到。另外,请注意,这些值是按1
NULL排在最后。
我已经尝试了以下方法,但是没有用:
offer_value_name
我认为这种方法行不通,因为如果详细信息商品没有offer_id,我也希望它选择NULL,那么它将被过滤掉。
答案 0 :(得分: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
。