2017-09-16 2 views
0

J'ai recherché autour mais cela semble être une exigence plus unique pour interroger des champs JSONB que commun et n'a pas trouvé une solution encore. Ma table a un champ jsonb appelé « plan », dont le contenu ressemble à ceci:Enregistrements de requête Postgres où tout élément dans le tableau d'objets dans le champ JSONB contient number> ou x x

{ 
    days: [ 
     { 
      summary: { 
       total: 100 
      } 
     } 
    ] 
} 

Il pourrait y avoir des objets potentiellement jour à l'infini à l'intérieur du tableau de jours. Est-il possible d'exécuter une requête qui sélectionne toutes les lignes où «total» est supérieur ou inférieur à un nombre donné dans au moins un des objets du jour?

Si nécessaire, je peux réorganiser la table ou prendre les données 'summary' et les placer dans un champ tableau postgres.

Répondre

1

Si je comprends bien votre question, vous pouvez chercher toutes les lignes avec total dans votre colonne jsonb plan pas égal à, disons 101, comme suit:

SELECT * 
FROM my_table t, 
    LATERAL jsonb_array_elements(plan->'days') days 
WHERE 
    (days->'summary'->>'total')::integer != 101; 
+0

Merci pour la réponse. Je l'avais déjà résolu en déplaçant les résumés vers une ligne ARRAY [], mais cela aurait pu être une solution beaucoup plus simple. Je vais essayer un jour. – Henry