IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes PostgreSQL Discussion :

Exploitation d'un Json [9.3]


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre habitué Avatar de GAEREL
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 160
    Points : 147
    Points
    147
    Par défaut Exploitation d'un Json
    Bonjour à tous.

    J'ai une table contenant une colonne "accusé de réception" sous la forme d'un json :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    WITH T AS (
    SELECT 1 AS id, '{"A":"NULL","B":"NULL","C":"NULL"}' AS accuse, 1234 valeur
    UNION
    SELECT 2, '{"A":"2015-06-02","B":"NULL","C":"NULL"}', 5678
    UNION
    SELECT 3, '{"A":"2015-06-01","B":"2015-06-02","C":"2015-06-03"}', 1011
    )
    SELECT id, accuse::json, valeur into tmp_json FROM T;
     
    SELECT * FROM tmp_json;
    Le principe est le suivant : A, B et C sont des clients qui viennent positionner leurs accusés de réception spécifiques lors de la récupération de la 'valeur'.

    Si une ligne a été lue par tous les clients, elle est candidate à la purge.

    Lors de la purge, je dois supprimer toutes les lignes :

    • qui ont été lues par tous les clients : WHERE position('NULL' IN accuse::TEXT) = 0 (ici seule la ligne avec la valeur 1011 est "purgeable")
      et
    • dont le MAX des accusés de réception ("2015-06-03") est strictement inférieur à la date du jour : AND .... Là je sèche !!!


    Une idée pour résoudre ce problème ?

    Merci d'avance

  2. #2
    Membre habitué Avatar de GAEREL
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 160
    Points : 147
    Points
    147
    Par défaut
    Solution 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DELETE FROM tmp_json  TJ
    USING     (    SELECT id
                FROM    tmp_json T,
                LATERAL json_each_text(T.accuse) json_data(client, date_)
                WHERE position('NULL' IN T.accuse::text) = 0
                GROUP BY 1
                HAVING MAX(date_::date) < v_date_purge_standard
            ) T
    WHERE   TJ.id = T.id;
    Solution 2 :
    Normaliser le schéma avec une table des "accusés de réception"...

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Essayez ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    delete from t
     where nullif(accuse->>'A', 'NULL')::date is not null
       and nullif(accuse->>'B', 'NULL')::date is not null
       and nullif(accuse->>'C', 'NULL')::date is not null
       and greatest(nullif(accuse->>'A', 'NULL')::date, nullif(accuse->>'B', 'NULL')::date, nullif(accuse->>'C', 'NULL')::date) < current_date;

  4. #4
    Membre habitué Avatar de GAEREL
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 160
    Points : 147
    Points
    147
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Essayez ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    delete from t
     where nullif(accuse->>'A', 'NULL')::date is not null
       and nullif(accuse->>'B', 'NULL')::date is not null
       and nullif(accuse->>'C', 'NULL')::date is not null
       and greatest(nullif(accuse->>'A', 'NULL')::date, nullif(accuse->>'B', 'NULL')::date, nullif(accuse->>'C', 'NULL')::date) < current_date;
    merci de votre réponse mais ce code n'est pas assez dynamique.
    En effet je ne sais pas à priori quels sont les clients, ni combien ils sont.
    Impossible donc d'utiliser ce code.

    je reste sur ma version.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] exploiter select mysql via json
    Par serna dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 12/12/2013, 10h27
  2. Exploiter un JSON dans JQPLOT
    Par villix dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/06/2013, 22h00
  3. Réponses: 3
    Dernier message: 22/05/2011, 18h11
  4. Exploiter un contenu renvoyé en JSON
    Par tchoumak dans le forum Langage
    Réponses: 2
    Dernier message: 17/10/2009, 20h27
  5. PHP et Json lecture et exploitation
    Par malkie dans le forum Langage
    Réponses: 10
    Dernier message: 25/02/2009, 02h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo