我将从JSONB数据类型入手,希望有人能够帮帮我。
我有一个表格(properties),其中包含两列(id为主键,data为jsonb)。 data的结构如下:
{
"ProductType": "ABC",
"ProductName": "XYZ",
"attributes": [
{
"name": "Color",
"type": "STRING",
"value": "Silver"
},
{
"name": "Case",
"type": "STRING",
"value": "Shells"
},
...
]
}
我想获取所有属性值为特定值的行,例如返回所有Case = 'Shells' 和/或 Color = 'Red'的行。
我尝试了以下方法,但是我无法应用两个条件,比如 Case ='Shells' 和 Color = 'Silver'。 当一个单独属性的名称和值与条件匹配时,我能够获取行,但我无法弄清如何使其适用于多个属性。
编辑1: 我能够使用以下查询获得结果:
WITH properties AS (
select *
from (
values
(1, '{"ProductType": "ABC","ProductName": "XYZ","attributes": [{"name": "Color","type": "STRING","value": "Silver"},{"name": "Case","type": "STRING","value": "Shells"}]}'::jsonb),
(2, '{"ProductType": "ABC","ProductName": "XYZ","attributes": [{"name": "Color","type": "STRING","value": "Red"},{"name": "Case","type": "STRING","value": "Shells"}]}'::jsonb)
) s(id, data)
)
select
*
from (
SELECT
id,
jsonb_object_agg(attr ->> 'name', attr -> 'value') as aggr
FROM properties m,
jsonb_array_elements(data -> 'attributes') as attr
GROUP BY id
) a
where aggr ->> 'Color' = 'Red' and aggr ->> 'Case' LIKE 'Sh%'
我可能会有数百万条这样的记录,所以我现在唯一的担忧是它是否高效,如果不是,是否有更好的方法?