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

Développement SQL Server Discussion :

[2005] Null dans un Case


Sujet :

Développement SQL Server

  1. #1
    Membre expérimenté
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Billets dans le blog
    4
    Par défaut [2005] Null dans un Case
    Bien le bonjour !
    Et bien voilà, nous venons de tomber sur un résultat un peu étrange en parlant de syntaxe d'un case.. je m'explique. J'ai toujours mis ma syntaxe comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT CASE maValeur
              WHEN 'x' THEN 0
                       ELSE 1
               END
    Et jusqu'ici, je n'avais jamais eu de problème. Mais on vient de me poser un erreur assez flagrante sur une même syntaxe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT CASE maValeur
              WHEN NULL THEN 0
                        ELSE 1
               END
    et là, le retour est à 0, même si ma valeur est null

    Alors, vous allez me dire "il existe la fonction ISNULL(maValeur, 0)" et je vous répondrais oui, mais la question était de devoir mettre 0 ou 1 quelque soit la valeur de "maValeur" ce qui fait que le ISNULL() n'est pas approprié.

    Alors si je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT CASE
             WHEN  maValeur IS NULL
               THEN 1
               ELSE 0
              END
    dans ce cas, le retour est bien 1 en cas de valeur null.. et c'est là ou ça tilt dans mon cerveau, parce que je ne comprend pas pourquoi l'une est interprétée et donne le bon résultat, mais pas l'autre pourquoi dans le premier cas, tout fonctionne, mais pas dans le 2ème...

    Je comptais sur vos lumières pour m'éclairer, parce que ça tilt sévère

    Cordialement.
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Mon Tutoriel pour apprendre les Agregations
    Consultez mon Blog SQL destiné aux débutants

    Pensez à FAQ SQL Server Ainsi qu'aux Cours et Tuto SQL Server

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    Je redis ce que je disais sur la chat en espérant qu'une personne que tu estimeras digne de confiance puisse apporter la confirmation que tu attends

    CASE ... WHEN ... fait la comparaison de valeur (=)

    NULL n'est pas une valeur, NULL est l'absence de valeur.
    NULL ne s'évalue donc pas par une opération de comparaison, mais par IS NULL.

    Le code suivant ne renverra aucune ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT 1
    WHERE NULL = NULL
    Le code suivant renverra une ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT 1
    WHERE NULL IS NULL

  3. #3
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Les propos de Sergejack sont tout à fait exacts : en effet NULL n'est pas une valeur, c'est une propriété qui signifie l'absence de valeur.

    C'est donc à ce titre qu'on ne peut pas écrire = NULL (sauf dans un UPDATE, ce que je trouve aberrant), mais bien IS NULL ou IS NOT NULL.

    A part de votre question, vous trouverez aussi la même aberration dans l'implémentation des contraintes d'unicité, où NULL est pris comme valeur. En effet lorsque vous insérez deux lignes dont une colonne est à NULL, et que sur cette même colonne il y a une contrainte d'unicité, vous levez une exception.
    On peut contourner celle-ci en filtrant l'index, mais les indexes filtrés ne sont disponibles que sous SQL Server 2008.

    @++

  4. #4
    Membre expérimenté
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Billets dans le blog
    4
    Par défaut
    Ce n'était pas contre toi Serjacke, c'est juste que j'aime être sur de mes sources, et fonder une affirmation sur une seul source ne me suffit pas si tu n'avais pas titilé mon cervelet droit, je n'aurais jamais posé la question . Merci à vous deux
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Mon Tutoriel pour apprendre les Agregations
    Consultez mon Blog SQL destiné aux débutants

    Pensez à FAQ SQL Server Ainsi qu'aux Cours et Tuto SQL Server

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 17/05/2011, 18h11
  2. [2005]codage complexe dans un CASE
    Par zooffy dans le forum Développement
    Réponses: 6
    Dernier message: 28/11/2008, 09h26
  3. [VB.net 2005] Définir une valeur nulle dans ma comboBox
    Par WriteLN dans le forum Framework .NET
    Réponses: 4
    Dernier message: 04/04/2008, 18h11
  4. Réponses: 2
    Dernier message: 17/08/2007, 16h51
  5. [Oracle] Recherche nulle dans une base et affichage
    Par GLDavid dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 27/04/2006, 02h01

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