获取由 jsonb 键过滤的值
Get values filtered by jsonb key
我有一个名为 houses
的 table,它有一个名为 details
的 jsonb
列。 details
jsonb 列的结构是:
{
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
我想做类似的事情,但现在我想获得所有不同的优惠价值,但只是针对特定的 offer_id。以下是一些示例数据,但我期望的是:
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_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
而且我认为这种方法行不通,因为如果详细信息没有 offer_id,我也希望它为 select NULL,这只会将其过滤掉.
我认为这可行:
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
。
我有一个名为 houses
的 table,它有一个名为 details
的 jsonb
列。 details
jsonb 列的结构是:
{
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
我想做类似的事情,但现在我想获得所有不同的优惠价值,但只是针对特定的 offer_id。以下是一些示例数据,但我期望的是:
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_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
而且我认为这种方法行不通,因为如果详细信息没有 offer_id,我也希望它为 select NULL,这只会将其过滤掉.
我认为这可行:
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
。