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 :

Comment additionner les éléments d'une chaîne


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre à l'essai
    Comment additionner les éléments d'une chaîne
    Bonjour,

    Dans une table de ma base PostgreSQL , j'ai une table T contenant deux colonnes, la première correspond à un identifiant et la seconde à une chaîne de caractères de la forme suivante : "nombre1+nombre2+..+nombreN".

    Ex :
    ID \ OPERATION
    1 \ 10+20+30
    2 \ 5+3+15+2
    3 \ 5+25+3+14+8

    Je souhaiterais écrire une requête SQL qui "interprête" le contenu de la colonne OPERATION et me permette de trouver le résultat de celle-ci pour obtenir ceci
    1 \ 60
    2 \ 25
    3 \ 55

    Je ne peux pas passer par une procédure stockée qui décomposerait ma chaîne en sous-éléments pour effectuer la somme, car je n'ai pas les droits sur la base pour pouvoir le faire et même si j'insiste, on ne me les donnera pas. il faut absolument que je fasse quelque chose du style :

    select ID , calculer( OPERATION )
    from T

    Je précise qu'il n'y a que des additions, et pas de parenthèse.

    J'ai cherché sur Internet s'il existait une telle fonction, en vain. De même sur le forum.

    En désespoir de cause, je me permets donc de vous adresser cette demande.

    D'avance Merci de l'attention que vous porterez à ma demande ainsi que, je l'espère, de vos futures réponses.

    Cordialement,

    GiDu

  2. #2
    Membre expert
    exercice assez interessant!
    Voici une solution
    Code SQL :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    with r as(select t.id, string_to_array(t.operation,'+') as operation from t),
    r2 as
    (select r.id, somme
    from r, LATERAL unnest(operation) somme)
    select r2.id, sum(trim(r2.somme)::numeric) from r2 group by id

    @+
    Le monde est trop bien programmé pour être l’œuvre du hasard…
    Mon produit pour la gestion d'école: www.logicoles.com

  3. #3
    Membre à l'essai
    Bonjour,

    Merci pour votre réponse.

    Moi qui me trouvais pas trop mauvais en SQL, vous êtes plusieurs crans au dessus de moi. Je ne peux pas luter, vous employez des notions qui m'étaient complètement inconnues (la jointure lateral notamment).

    Malheureusement, votre réponse, qui bien évidemment fonctionne, ne peut répondre à mon problème.

    En effet, je dois rentrer ce code dans un logiciel qui génère du code SQL type Business Objects, donc impossible de mettre une jointure "lateral". Je n'ai pas pensez à vous l'indiquer dans mon précédent message car je n'imaginais pas une telle solution. Désolé.

    J'ai réussi à simplifier votre solution comme ceci :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select id , sum( trim( somme )::numeric )
    from T ,
    lateral unnest( string_to_array( operation , '+' ) ) somme
    group by id



    Mais il faudrait que j'arrive à simplifier encore plus pour obtenir quelque chose qui ressemble à cela :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    select id , sum( trim( unnest( string_to_array( operation , '+' ) ) )::numeric )
    from T
    group by id


    afin de pouvoir créer un objet dans le Designer BO avec le code : sum( trim( unnest( string_to_array( operation , '+' ) ) )::numeric ).

    Mais cette dernière requête ne fonctionne hélas pas, le message suivant s'affiche :
    SQL Error [0A000]: ERREUR: la fonction avec set-value a été appelé dans un contexte qui n'accepte pas un ensemble
    ce qui ne me surprend pas quand on regarde l'explication sur la jointure lateral.

    Auriez-vous SVP une alternative ?

    Encore Merci pour tout.

    Gidu

  4. #4
    Membre à l'essai
    Finalement, en surfant sur le net à partir de ce que vous m'avez dit, j'ai finalement trouvé une solution que je vous partage :

    Code sql :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    select id ,
           ( select sum( s::numeric ) from unnest( string_to_array( operation , '+' ) ) s )
    from T


    Je ne vais pas clore la discussion tout de suite, au cas où vous souhaiteriez ajouter un commentaire.

    En tout cas, encore merci pour votre aide initiale, ça m'a mis sur la bonne piste.

    Cordialement,

    GiDu

  5. #5
    Membre expert
    Salut Gidu59
    Citation Envoyé par Gidu59 Voir le message
    Je ne vais pas clore la discussion tout de suite, au cas où vous souhaiteriez ajouter un commentaire.
    Qu'est ce que je peux dire de plus à part CHAPEAU!
    @+
    Le monde est trop bien programmé pour être l’œuvre du hasard…
    Mon produit pour la gestion d'école: www.logicoles.com

  6. #6
    Membre à l'essai
    Restons modeste, sans votre réponse initiale, je n'y serai pas parvenu.

###raw>template_hook.ano_emploi###