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

MS SQL Server Discussion :

Doublons et valeurs Nulles


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2004
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 110
    Par défaut Doublons et valeurs Nulles
    Bonjour à tous,

    Le but de cet exemple(voir code plus bas) est de récupérer la liste des DBL_NUM n'ayant pas de doublons . Hors quand j'exécute la requête SELECT aucun enregistrement n'est renvoyé.

    Il semble que les valeurs nulles stockées dans DBL_NUM posent problème car si je supprime les enregistrements avec DBL_NUM=NULL la requête fonctionne.

    Si quelqu'un peut éclairer ma lanterne ?


    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
     
    CREATE TABLE T_DOUBLON_DBL
    (	DLB_ID INTEGER NOT NULL IDENTITY(1,1) PRIMARY KEY ,
    	DBL_NUM  INT NULL
    )
    GO
    INSERT INTO T_DOUBLON_DBL(DBL_NUM) VALUES (33)
    INSERT INTO T_DOUBLON_DBL(DBL_NUM) VALUES (33)
    INSERT INTO T_DOUBLON_DBL(DBL_NUM) VALUES (22)
    INSERT INTO T_DOUBLON_DBL(DBL_NUM) VALUES (NULL)
    INSERT INTO T_DOUBLON_DBL(DBL_NUM) VALUES (NULL)
    INSERT INTO T_DOUBLON_DBL(DBL_NUM) VALUES (55)
    INSERT INTO T_DOUBLON_DBL(DBL_NUM) VALUES (66)
    GO
    select * from T_DOUBLON_DBL WHERE DBL_NUM NOT IN 	(SELECT DBL_NUM
    							FROM T_DOUBLON_DBL
    							GROUP BY DBL_NUM
    							HAVING COUNT(*)>1
    							)
    GO

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 002
    Billets dans le blog
    6
    Par défaut
    NULL n'étant pas une valeur, aucune comparaison ne peut être effectué dessus. NULL n'est ni égal ni différent de lui même.
    Lisez ce que j'ai écrit à ce sujet : http://sqlpro.developpez.com/cours/null/

    Dans votre cas, prévoyez d'utiliser une fonction de dénullification, pas exemple COALESCE.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  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,

    Hé oui, NULL n'est pas une valeur : c'est un marqueur qui signifie justement l'absence de valeur.
    Pour vous en convaincre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    IF NULL = NULL
    	PRINT 'OK'
    ELSE
    	PRINT 'KO'
    Vous pouvez essayer avec tout autre symbole qu'égale, vous obtiendrez toujours KO

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ;WITH
    	CTE AS
    	(
    		SELECT	DBL_NUM
    		FROM	T_DOUBLON_DBL
    		GROUP	BY DBL_NUM
    		HAVING	COUNT(*) > 1
    	)
    SELECT		DBL.*
    FROM		T_DOUBLON_DBL AS DBL
    LEFT JOIN	CTE AS C ON C.DBL_NUM = DBL.DBL_NUM
    WHERE		C.DBL_NUM IS NULL
    AND		DBL.DBL_NUM IS NOT NULL
    ou encore, comme proposé par SQLPro :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ;WITH
    	CTE AS
    	(
    		SELECT	ISNULL(DBL_NUM, 0) AS DBL_NUM
    		FROM	T_DOUBLON_DBL
    		GROUP	BY DBL_NUM
    		HAVING	COUNT(*) > 1
    	)
    SELECT		DBL.*
    FROM		T_DOUBLON_DBL AS DBL
    LEFT JOIN	CTE AS C ON C.DBL_NUM = ISNULL(DBL.DBL_NUM, 0)
    WHERE		C.DBL_NUM IS NULL
    AND		DBL.DBL_NUM IS NOT NULL
    @++

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

Discussions similaires

  1. requete avec la valeur NULL
    Par Hinkel dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 12/11/2008, 16h39
  2. Passer une valeur Null dans un argument de procédure
    Par preempalver dans le forum VBA Access
    Réponses: 5
    Dernier message: 30/12/2003, 20h52
  3. Selectionner un champ de valeur nulle
    Par arcane dans le forum Requêtes
    Réponses: 2
    Dernier message: 30/09/2003, 14h26
  4. [CR9] conversion de valeurs NULL
    Par ministry dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 12/09/2003, 11h41
  5. Valeurs Nulles ou Valeurs à Zéro
    Par LLaurent dans le forum XMLRAD
    Réponses: 5
    Dernier message: 30/07/2003, 11h40

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