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 :

Problème avec NVL sous ORACLE


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Points : 78
    Points
    78
    Par défaut Problème avec NVL sous ORACLE
    Bonjour,

    j'ai l'impression que la fonction NVL ne marche pas correctement sur ma base.
    Je suis tombé sur la requete suivante en reprenant du code en PL/SQL sous ORACLE 10 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
      SELECT NVL(SUM(ABS(MaColonne)),0) FROM MaTable WHERE Condition 1
    Sachant que le type de la colonne MaColonne est NUMBER.

    Il m'a semblé alors que ce serait plus juste d'écrire la suite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
      SELECT SUM(ABS(NVL(MaColonne, 0))) FROM MaTable WHERE Condition 1
    Or, la première requête marche bien alors que la seconde renvoie systématiquement NULL

    Sachant qu'après reflexion je me suis rendu que dans la table MaTable, il n'y a aucune valeur de MaColonne à NULL, je suis perplexe

    J'ai posté en premier lieu sur le forum SQL où on m'a dit que mon raisonnement était correct. Comme j'ai l'impression sur d'autres requetes que mon NVL agit "bizarrement" je reposte sur le forum ORACLE pour savoir s'il n'y a pas une particularité de ce SGBD que j'ignore au niveau de cette fonctionnalité.

    Merci pour vos réponses

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Points : 220
    Points
    220
    Par défaut
    Très étrange... le résultat devrait être le même car les NULL comptent comme 0 dans SUM.

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    rbaraer@Ora10g> SELECT SUM(ABS(NVL(col, 0))) "Absolute Sum"
    FROM
    (
        SELECT 3 col FROM DUAL
        UNION
        SELECT 10 col FROM DUAL
        UNION
        SELECT -7 col FROM DUAL
        UNION
        SELECT NULL col FROM DUAL
    );  2    3    4    5    6    7    8    9   10   11
     
    Absolute Sum
    ------------
              20
     
    rbaraer@Ora10g> SELECT NVL(SUM(ABS(col)), 0) "Absolute Sum"
    FROM
    (
        SELECT 3 col FROM DUAL
        UNION
        SELECT 10 col FROM DUAL
        UNION
        SELECT -7 col FROM DUAL
        UNION
        SELECT NULL col FROM DUAL
    );  2    3    4    5    6    7    8    9   10   11
     
    Absolute Sum
    ------------
              20
     
    rbaraer@Ora10g> SELECT SUM(ABS(NVL(col, 0))) "Absolute Sum"
    FROM
    (
        SELECT NULL col FROM DUAL
    );  2    3    4    5
     
    Absolute Sum
    ------------
               0
     
    rbaraer@Ora10g> SELECT NVL(SUM(ABS(col)), 0) "Absolute Sum"
    FROM
    (
        SELECT NULL col FROM DUAL
    );  2    3    4    5
     
    Absolute Sum
    ------------
               0
     
    rbaraer@Ora10g>
    Etes-vous sûr que la condition dans la clause WHERE est exactement la même ?

    Pouvez-vous poster la requête complète ?

    Cordialement,

    rbaraer

  3. #3
    Membre confirmé Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Points : 481
    Points
    481
    Par défaut
    Bonjour,

    Ceci peut s'expliquer si "Condition 1" est toujours fausse :
    Les ensembles renvoyés ne sont pas les mêmes :
    Dans la première, l'agrégat est fait, puis le nvl traite le résultat : si pas de résultat, on renvoie la valeur paliative.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SQL> select SUM(ABS(dummy)) FROM dual WHERE 0=1;
     
    SUM(ABS(DUMMY))
    ---------------
     
     
    SQL> SELECT NVL(SUM(ABS(dummy)),0) FROM dual WHERE 0=1;
     
    NVL(SUM(ABS(DUMMY)),0)
    ----------------------
                         0
    Dans la seconde, si pas de valeur ... pas de valeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SQL> SELECT SUM(ABS(NVL(dummy, 0))) FROM dual WHERE 0=1;
     
    SUM(ABS(NVL(DUMMY,0)))
    ----------------------
     
     
    SQL>
    En espérant que cela puisse t'aider un peu ...
    Je penche, donc je suis

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Points : 220
    Points
    220
    Par défaut
    Ah oui effectivement chrifo, je n'avais pas pensé au cas où il n'y a aucun résultat...

    rbaraer

  5. #5
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Points : 78
    Points
    78
    Par défaut
    Citation Envoyé par rbaraer
    Etes-vous sûr que la condition dans la clause WHERE est exactement la même ?
    rbaraer
    La condition est exactement la même

    Citation Envoyé par chrifo
    En espérant que cela puisse t'aider un peu ...
    chrifo
    Oui je pense que ça a même entièrement répondu à ma question
    Merci beaucoup pour tes explications dont l'illustration exemple à l'appui a été plus facile à appréhender pour moi
    Je m'en vais de ce pas revoir mon code !

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

Discussions similaires

  1. Problème avec les DBLink Oracle 9i sous toad
    Par Fngonka dans le forum Toad
    Réponses: 17
    Dernier message: 02/07/2008, 12h21
  2. Problème avec EInOutError sous delphi 2005
    Par Teb dans le forum Langage
    Réponses: 3
    Dernier message: 19/08/2005, 11h48
  3. fichier .bat : problèmes avec des sous-répertoires
    Par aymron dans le forum Windows
    Réponses: 4
    Dernier message: 23/06/2005, 09h33
  4. Problème avec glutFullScreen() sous linux...
    Par MaxPayne dans le forum OpenGL
    Réponses: 1
    Dernier message: 29/11/2004, 11h30
  5. Problème avec CopyDir sous D5
    Par Houben Jacques dans le forum Langage
    Réponses: 3
    Dernier message: 26/05/2003, 22h02

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