Je débute avec le type de données JSONB et j'espère que quelqu'un pourra m'aider.
J'ai un tableau ( propriétés ) avec deux colonnes ( id comme clé primaire et données comme jsonb). Les données est la structure :
{
"ProductType": "ABC",
"ProductName": "XYZ",
"attributes": [
{
"name": "Color",
"type": "STRING",
"value": "Silver"
},
{
"name": "Case",
"type": "STRING",
"value": "Shells"
},
...
]
}
J'aimerais obtenir toutes les lignes où un attribut a une valeur spécifique, c'est-à-dire renvoyer toutes les lignes où Case = 'Shells' et/ou Couleur = "Rouge".
J'ai essayé ce qui suit, mais je ne parviens pas à appliquer deux conditions telles que Case = 'Shells' et Color = 'Silver'. Je peux obtenir des lignes lorsque le nom et la valeur d'un seul attribut correspondent aux conditions, mais je n'arrive pas à comprendre comment faire fonctionner cela pour plusieurs attributs.
EDIT 1 : Je parviens à obtenir les résultats en utilisant la requête suivante :
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%'
Je pourrais potentiellement avoir des millions de ces enregistrements, donc je suppose que ma seule préoccupation est de savoir si c'est efficace et, si ce n'est pas le cas, s'il y a une meilleure façon de procéder.