获取按jsonb键过滤的值

时间:2019-02-08 08:58:06

标签: sql postgresql jsonb

我有一个名为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,那么它将被过滤掉。

1 个答案:

答案 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