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

Langage SQL Discussion :

Comparer deux champs NULL


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 155
    Points : 89
    Points
    89
    Par défaut Comparer deux champs NULL
    Bonjour,

    Pour mettre à jour une table, je charge un flux xml que je met dans une table temporaire et ensuite je compare les deux tables afin de savoir quelles lignes doivent être mises à jour.
    Pour isoler mon problème, j'ai réduit tous cela au minimum.

    Soit la table test contenant les données présenté comme ceci :
    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
     
    CREATE TABLE IF NOT EXISTS `test` (
      `id` bigint(20) NOT NULL,
      `nom` varchar(100) NOT NULL,
      `date` date DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
     
    --
    -- Déchargement des données de la table `test`
    --
     
    INSERT INTO `test` (`id`, `nom`, `date`) VALUES
    (1650170, 'BARDET', '2011-08-29'),
    (1650163, 'THEVENARD', NULL);
    Soit la table test_temp contenant les données du flux pour mettre ensuite à jour test :
    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
     
    CREATE TABLE IF NOT EXISTS `test_temp` (
      `id` bigint(20) NOT NULL,
      `nom` varchar(100) NOT NULL,
      `date` date DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
     
    --
    -- Déchargement des données de la table `test_temp`
    --
     
    INSERT INTO `test_temp` (`id`, `nom`, `date`) VALUES
    (1650170, 'BARDET', '2011-08-29'),
    (1650163, 'THEVENARD', NULL);
    Je récupère les données devant etre modifiés en réalisant cette requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $sql = "SELECT st.id, st.nom, st.date
    	  FROM test_temp st
    	  WHERE NOT EXISTS (SELECT NULL FROM test s
    	    WHERE s.id = st.id
    	    AND s.nom = st.nom
    	    AND s.date = st.date
    	    )
    	  ORDER BY st.id 
    	  LIMIT 100";
    Comme vous pouvez le voir le champ date peut-être NULL.
    Mon problème est que si les champs date valent NULL dans les deux tables pour une ligne donnée, mysql la considère comme différentes.
    J'ai l'impression que NULL n'est pas égal à NULL en quelques sortes.

    Si le champ date contiens des dates identiques, pas de soucis, ils les voient bien comme identiques.

    Peut-on comparer des champs ayant pour valeur null ?
    Comment feriez-vous ?
    Ai-je fait une erreur quelques part ?

    Je suis preneur de toutes informations me fesant avancer.

    Merci d'avance.

    Yannick

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    coucou,
    Personnellement je testerai le null à part comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT st.id, st.nom, st.date
    FROM test_temp st
    WHERE NOT EXISTS (SELECT NULL FROM test s
     WHERE s.id = st.id
     AND s.nom = st.nom
    AND (s.date = st.date or (s.date is null and st.date is null))
     
    )
     ORDER BY st.id
    Cordialement
    Soazig

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Citation Envoyé par yann123456 Voir le message
    J'ai l'impression que NULL n'est pas égal à NULL en quelques sortes.
    C'est tout à fait le cas.
    NULL étant une absence de valeur, un inconnu, il ne peut être comparé
    NULL n'est donc ni égal ni différent de quoi que ce soit en règle générale.

    Vous pourriez passer par un except pour simplifier la gestion de ce cas, mais visiblement sous êtes sous mysql qui -il me semble- ne supporte pas cet opérateur

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 155
    Points : 89
    Points
    89
    Par défaut
    Merci de vos réponses.

    La proposition de soazig fonctionne très bien.
    @aieeeuuuuu : effectivement, je suis sous mysql.

    Merci à vous deux, mon problème est résolu.

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

Discussions similaires

  1. Comparer deux champs concaténés
    Par mouaa dans le forum Langage SQL
    Réponses: 2
    Dernier message: 21/05/2008, 15h26
  2. Filtrer une table en comparant deux champs entre eux
    Par damene dans le forum Débuter
    Réponses: 13
    Dernier message: 12/04/2008, 19h10
  3. comparer deux champs d un formulaire
    Par williams59 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 21/12/2007, 11h38
  4. Editeur de recherche - comparer deux champs
    Par sscouby dans le forum 4D
    Réponses: 1
    Dernier message: 17/10/2007, 12h08
  5. Egalité entre deux champs NULL ?
    Par AyaGizmo dans le forum SQL
    Réponses: 2
    Dernier message: 08/06/2007, 11h42

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