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

SQL Oracle Discussion :

Représentation formule math


Sujet :

SQL Oracle

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2008
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 101
    Points : 126
    Points
    126
    Par défaut Représentation formule math
    Bonjour,

    Je suis sous Oracle 10g et je veux :
    1- représenter une formule de calcul (simple) en base
    2- reconstruire la formule à partir d'une requête SQL

    Pour le "1", je représente ma formule sous forme d'arbre binaire avec l'opérateur (+, -, * ou /) sur chaque noeud et une constante ou une "sous-formule" sur chaque branche.

    J'ai essayé de reconstruire ma formule en utilisant les requêtes hiérarchiques, mais au mieux j'obtiens une suite d'opérateurs...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    with Formule as (Select 1 id, '+' signe, 2 ssformid_gauche, 3 ssformid_droit, null const From  dual union all
    Select 2 id, null signe, null ssformid_gauche, null ssformid_droit, 1 const From  dual union all
    Select 3 id, '*' signe, 4 ssformid_gauche, 5 ssformid_droit, null const From dual union all
    Select 4 id, '*' signe, 6 ssformid_gauche, 7 ssformid_droit, null const From dual union all
    Select 5 id, '*' signe, 8 ssformid_gauche, 9 ssformid_droit, null const From dual union all
    Select 6 id, null signe, null ssformid_gauche, null ssformid_droit, 2 const From dual union all
    Select 7 id, null signe, null ssformid_gauche, null ssformid_droit, 3 const From dual union all
    Select 8 id, null signe, null ssformid_gauche, null ssformid_droit, 4 const From dual union all
    Select 9 id, null signe, null ssformid_gauche, null ssformid_droit, 5 const From dual 
    )
    Select Level, f.*,
           SYS_CONNECT_BY_PATH(nvl(signe, const), ' ')
    From formule f
     Start With ID = 1
     connect by (Prior ssformid_gauche = ID Or Prior ssformid_droit = ID)
    J'ai représenté l 'arbre suivant :
     +
    / \
    1  *
      / \
     *   *
    / \ / \
    2 3 4 5
    et je veux en sortie : 1+2*3*4*5

    Merci

  2. #2
    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
    Pas évident en 10g.
    Je ne pense pas qu'on puisse utiliser connect by ici, car on n'a aucune idée de la façon dont Oracle va faire la récursion, hors ici il faut d'abord connecter sur la gauche avant de connecter sur la droite.
    Avec les opérateurs commutatifs ça ne pose pas de soucis, mais si vous voulez utiliser - et / ça ne marchera plus.

    Probablement faisable en 11gR2 avec les r-CTE.

    Mes résultats de bidouilles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    WITH Formule AS
    (
    SELECT 1 id, '+' signe, 2 ssformid_gauche, 3 ssformid_droit, NULL const FROM dual union ALL
    SELECT 2   , NULL     , NULL             , NULL            , 1          FROM dual union ALL
    SELECT 3   , '*'      , 4                , 5               , NULL       FROM dual union ALL
    SELECT 4   , '*'      , 6                , 7               , NULL       FROM dual union ALL
    SELECT 5   , '*'      , 8                , 9               , NULL       FROM dual union ALL
    SELECT 6   , NULL     , NULL             , NULL            , 2          FROM dual union ALL
    SELECT 7   , NULL     , NULL             , NULL            , 3          FROM dual union ALL
    SELECT 8   , NULL     , NULL             , NULL            , 4          FROM dual union ALL
    SELECT 9   , NULL     , NULL             , NULL            , 5          FROM dual
    )
      ,  SR1 AS
    (
        SELECT level
             , rownum AS rn
             , id
             , prior id
             , coalesce(signe, to_char(const)) AS ope
             , connect_by_isleaf AS cbi
          FROM formule f
    START WITH ID = 1
    CONNECT BY ID IN (prior ssformid_gauche, prior ssformid_droit)
    )
      ,  SR2 AS
    (
    SELECT sr1.*
         , case 
             when cbi = 0
              AND lead(cbi, 1) over(ORDER BY rn ASC) = 1
             then lead(rn , 1) over(ORDER BY rn ASC) + id / 100
             when cbi = 0
              AND lead(cbi, 1) over(ORDER BY rn ASC) = 0
             then lead(rn , 3) over(ORDER BY rn ASC) + id / 100
             else rn
           end ord
      FROM sr1
    )
    SELECT REPLACE(REPLACE(XMLAgg(XMLElement("x", ope) ORDER BY ord ASC), '</x>', ''), '<x>', '') AS formule
      FROM sr2;
     
    FORMULE                                                                         
    ---------
    1+2*3*4*5

  3. #3
    Membre habitué
    Inscrit en
    Septembre 2008
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 101
    Points : 126
    Points
    126
    Par défaut
    Merci pour la réponse.

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

Discussions similaires

  1. [Débutante] Conversion formules math unicode
    Par sushi_sushi dans le forum Android
    Réponses: 0
    Dernier message: 20/05/2012, 12h53
  2. [XL-2007] Un formule math pour toutes les cellules d'une colone
    Par mentat dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 09/01/2010, 16h29
  3. formule maths dans une page web
    Par crow56 dans le forum Débuter
    Réponses: 7
    Dernier message: 29/12/2008, 15h41
  4. Retranscrire formule (Maths) en PHP
    Par hm1ch dans le forum Langage
    Réponses: 3
    Dernier message: 03/12/2007, 19h20
  5. Exemple d'algo pr débutant avec formule math ?!
    Par Spirit Attack dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 14/11/2006, 13h07

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