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

Requêtes MySQL Discussion :

Sélection incorrecte avec IS NOT NULL [MySQL-5.6]


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Entrepreneur
    Inscrit en
    Février 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Entrepreneur
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Février 2013
    Messages : 18
    Points : 16
    Points
    16
    Par défaut Sélection incorrecte avec IS NOT NULL
    Bonjour,
    J'ai créé une table t_animaux qui contient une colonne commentaire_animal.
    Dans la colonne animal, soit un commentaire existe soit la valeur NULL est affichée.
    Quand je fais :

    SELECT *
    FROM t_animaux
    WHERE commentaire_animal != NULL;

    J'obtiens les bons résultats.

    Par contre quand je fais : WHERE commentaire_animal IS NOT NULL, j'obtiens des lignes supplémentaires où les commentaires sont NULL.

    Pouvez-vous me donner une piste de travail?
    D'avance merci pour le temps que vous prendrez à me répondre.
    Cordialement.

  2. #2
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut cataclop.

    NULL n'est pas une valeur mais un marqueur.
    Vous devez utilisez le bon opérateur pour vérifier si la colonne est marqué à NULL où si vous avez des valeurs de renseignées.
    --> https://dev.mysql.com/doc/refman/5.7...with-null.html
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE commentaire_animal != NULL;
    La bonne syntaxe est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE commentaire_animal IS NOT NULL;
    Voici un exemple basique :
    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
        DEFAULT CHARACTER SET `latin1`
        DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    CREATE TABLE `test`
    ( `id`      integer unsigned not null auto_increment primary key,
      `lib`     varchar(255)         null default null
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `test` (`lib`) values
      ('tigre'),('lion'),(default),('singe'),(NULL),('chat'),(default)
    --------------
     
    --------------
    select * from `test`
    --------------
     
    +----+-------+
    | id | lib   |
    +----+-------+
    |  1 | tigre |
    |  2 | lion  |
    |  3 | NULL  |
    |  4 | singe |
    |  5 | NULL  |
    |  6 | chat  |
    |  7 | NULL  |
    +----+-------+
    --------------
    select * from test where lib is not null
    --------------
     
    +----+-------+
    | id | lib   |
    +----+-------+
    |  1 | tigre |
    |  2 | lion  |
    |  4 | singe |
    |  6 | chat  |
    +----+-------+
    --------------
    select * from test where lib is null
    --------------
     
    +----+------+
    | id | lib  |
    +----+------+
    |  3 | NULL |
    |  5 | NULL |
    |  7 | NULL |
    +----+------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
    Appuyez sur une touche pour continuer...
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  3. #3
    Membre à l'essai
    Homme Profil pro
    Entrepreneur
    Inscrit en
    Février 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Entrepreneur
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Février 2013
    Messages : 18
    Points : 16
    Points
    16
    Par défaut
    Bonjour Artemus24,
    Merci d'avoir pris le temps de me répondre.

    J'ai bien compris vos propos mais mon souci est le suivant :

    Si je prends votre table :



    +----+-------+
    | id | lib |
    +----+-------+
    | 1 | tigre |
    | 2 | lion |
    | 3 | NULL |
    | 4 | singe |
    | 5 | NULL |
    | 6 | chat |
    | 7 | NULL |
    +----+-------+

    et que je fais votre requète bien sur sur ma propre table)

    --------------
    select * from test where lib is not null
    --------------

    alors j'obtiens quand même quelques lignes qui sont marquées à NULL.
    Je précise que les données sont issues d'un fichier .sql et intégrées à ma base de données et que j'ai vérifié toutes les lignes qui sont pointées à NULL. Par contre la colonne concernée n'est pas à NULL par défaut.
    Bien cordialement,

  4. #4
    Membre confirmé Avatar de isabelle.letrong
    Femme Profil pro
    Conseil - Consultante en systèmes d'information
    Inscrit en
    Juillet 2010
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Conseil - Consultante en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2010
    Messages : 109
    Points : 487
    Points
    487
    Par défaut bannir les colonnes avec NULL. autorisé...
    Bonjour,

    Cataclop, très bizarre votre résultat...
    Votre table dispose bien d'une clé primaire ? (id est bien déclaré explicitement comme 'Primary Key' (cf. exemple d'Artemus24)).

    Par ailleurs, en acceptant les NULL dans la colonne t_animaux.commentaire_animal, votre modèle n'est pas propre : Pour être 'Relational compliant' vous devez supprimer cette colonne et créer une table comportant cette colonne 'commentaire_animal' avec l'attribut 'NOT NULL' . Cette nouvelle table (vous aurez donc 2 tables) hérite par ailleurs de la clé primaire de la table t_animaux.

    Alors oui, cela imposera des jointures mais vous aurez un modèle propre et vous ne serez pas à traîner partout des 'IS NULL' ou des 'IS NOT NULL' dans vos requêtes.

    Bien cordialement.

  5. #5
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut à tous.

    Citation Envoyé par cataclop
    Je précise que les données sont issues d'un fichier .sql et intégrées à ma base de données et que j'ai vérifié toutes les lignes qui sont pointées à NULL.
    Qu'est-ce que vous entendez par un fichier ".sql" ? Voulez-vous dire que cela vient d'un export, d'une autre base de données MySql ?

    Le mieux est de me communiquer :
    --> le descriptif de votre table
    --> le contenu de votre fichier ".sql"
    --> comment avez-vous chargé ce fichier
    --> et un exemple avec jeu d'essai (comme celui que je vous ai communiqué) reproduisant votre anomalie.

    Citation Envoyé par isabelle.letrong
    Votre table dispose bien d'une clé primaire ?
    Le problème n'a rien à voir avec une clef primaire.

    Citation Envoyé par isabelle.letrong
    Par ailleurs, en acceptant les NULL dans la colonne t_animaux.commentaire_animal, votre modèle n'est pas propre
    Si vos propos concernant le mauvais usage du NULL fait par cataclop sont correctes, vous ne savez pas s'il n'est pas dans une phase de chargement de ces tables.

    Je soupçonne que son problème provient du chargement d' une chaîne de caractères "NULL" et non le marqueur NULL.
    Sans plus d'explication, je ne peux qu’émettre des hypothèses.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  6. #6
    Membre confirmé Avatar de isabelle.letrong
    Femme Profil pro
    Conseil - Consultante en systèmes d'information
    Inscrit en
    Juillet 2010
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Conseil - Consultante en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2010
    Messages : 109
    Points : 487
    Points
    487
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    Le problème n'a rien à voir avec une clef primaire.
    Personnellement l'IT m'a appris l'humilité et à ne pas être péremptoire....et j'ai rencontré des requêtes basées sur des tables sans clés primaires donnant des résultats bien inattendus.

    Ceci étant

    Citation Envoyé par Artemus24 Voir le message
    Je soupçonne que son problème provient du chargement d' une chaîne de caractères "NULL" et non le marqueur NULL.
    Si effectivement le fichier d'import comporte, pour marquer la colonne à NULL, des séquences <delimiter>NULL<delimiter> au lieu de <delimiter><delimiter> <delimiter> étant une tabulation ou une virgule dans le cas d'un fichier CSV, alors Artemus24 a effectivement trouvé l'origine du problème....

    Bien cordialement.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Entrepreneur
    Inscrit en
    Février 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Entrepreneur
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Février 2013
    Messages : 18
    Points : 16
    Points
    16
    Par défaut
    Bonjour tout le monde,

    J'ai presque résolu mon problème.

    La sélection dans ma table était :

    SELECT t_animaux.id_animal,t_animaux.nom_animal,t_animaux.commentaire_animal FROM t_animaux
    WHERE commentaire_animal IS NOT NULL;

    qui me donnait le résultat suivant :

    +-----------+------------+--------------------------------------+
    | id_animal | nom_animal | commentaire_animal |
    +-----------+------------+--------------------------------------+
    | 1 | Rox | A quelques tendances au mordillement |
    | 4 | Fila | NULL |
    | 5 | Choupi | Ne sans oreille gauche |
    | 6 | Bobosse | Caractère spécial |
    | 9 | Java | NULL |
    | 34 | Raccou | Pas de queue depuis la naissance |
    | 35 | Boucan | NULL |
    | 36 | Callune | NULL |
    | 37 | Boule | NULL |
    | 38 | Zara | NULL |
    | 39 | Milla | NULL |
    | 40 | Feta | NULL |
    | 41 | Bilba | Sourde de l'oreille droite à 80% |
    | 42 | Cracotte | NULL |
    | 43 | Cawette | NULL |
    | 44 | Nikki | NULL |
    | 45 | Tortilla | NULL |
    | 46 | Scroupy | NULL |
    | 47 | Lulla | NULL |
    | 48 | Dana | NULL |
    | 49 | Cheli | NULL |
    | 50 | Chicana | NULL |
    | 51 | Redbul | Insomniaque |
    | 52 | Spoutnik | NULL |
    | 53 | Bubulle | NULL |
    | 54 | Relou | En surpoids |
    | 55 | Bulbizard | NULL |
    | 56 | Safran | NULL |
    | 57 | Gingko | NULL |
    | 58 | Bavard | NULL |
    | 59 | Parlotte | NULL |
    +-----------+------------+--------------------------------------+

    Hormis les deux lignes écrites en rouge, le problème était le suivant :
    j'ai voulu intégrer des valeurs issues d'un fichier .csv édité sur notepad++. Malheureusement le fichier a été ouvert par Excel en format .csv, ceci a eu pour conséquence de transformer tous les NULL en chaînes de caractères. d'où le résultat.

    Me reste à résoudre les deux lignes en rouge qui sont issues d'un fichier créé en .sql avec notepad++ dont je vous mets une copie :

    INSERT INTO t_animaux (espece_animal,sexe_animal,naissance_animal,nom_animal,commentaire_animal) VALUES
    ('chien', 'F', '2008-02-20 15:45:00' , 'Canaille', NULL),
    ('chien', 'F','2009-05-26 08:54:00' , 'Cali', NULL),
    ('chien', 'F','2007-04-24 12:54:00' , 'Rouquine', NULL),
    ('chien', 'F','2009-05-26 08:56:00' , 'Fila', NULL),
    ('chien', 'F','2008-02-20 15:47:00' , 'Anya', NULL),
    ('chien', 'F','2009-05-26 08:50:00' ,'Louya' , NULL),
    ('chien', 'F', '2008-03-10 13:45:00','Welva' , NULL),
    ('chien', 'F','2007-04-24 12:59:00' ,'Zira' , NULL),
    ('chien', 'F', '2009-05-26 09:02:00','Java' , NULL),
    ('chien', 'M','2007-04-24 12:45:00' ,'Balou' , NULL),
    ('chien', 'M','2008-03-10 13:43:00' ,'Pataud' , NULL),
    ('chien', 'M','2007-04-24 12:42:00' , 'Bouli', NULL),
    ('chien', 'M', '2009-03-05 13:54:00','Zoulou' , NULL),
    ('chien', 'M','2007-04-12 05:23:00' ,'Cartouche' , NULL),
    ('chien', 'M', '2006-05-14 15:50:00', 'Zambo', NULL),
    ('chien', 'M','2006-05-14 15:48:00' ,'Samba' , NULL),
    ('chien', 'M', '2008-03-10 13:40:00','Moka' , NULL),
    ('chien', 'M', '2006-05-14 15:40:00','Pilou' , NULL),
    ('chat', 'M','2009-05-14 06:30:00' , 'Fiero', NULL),
    ('chat', 'M','2007-03-12 12:05:00' ,'Zonko', NULL),
    ('chat', 'M','2008-02-20 15:45:00' , 'Filou', NULL),
    ('chat', 'M','2007-03-12 12:07:00' , 'Farceur', NULL),
    ('chat', 'M','2006-05-19 16:17:00' ,'Caribou' , NULL),
    ('chat', 'M','2008-04-20 03:22:00' , 'Capou', NULL),
    ('chat', 'M','2006-05-19 16:56:00' , 'Raccou', 'Pas de queue depuis la naissance');

    Là je ne comprends pas pourquoi ces deux lignes posent problème.

    Je vous remercie pour la qualité de vos réponses,

    Bien cordialement,

  8. #8
    Membre à l'essai
    Homme Profil pro
    Entrepreneur
    Inscrit en
    Février 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Entrepreneur
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Février 2013
    Messages : 18
    Points : 16
    Points
    16
    Par défaut
    Bonjour à tous,

    J'ai enfin trouvé :

    Pour les deux lignes qui posaient problème, en fait j'ai dans un premier temps créé la table t_animaux en intégrant manuellement ces deux lignes mais dans la partie commentaire j'ai écris 'NULL' au lieu de NULL.

    Merci à Artemus24 et à Isabelle.

    Cordialement

  9. #9
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut cataclop.

    Dans un fichier Excel (.csv), le NULL ne se code pas en mettant "NULL" mais en codant "\N" dans la cellule.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

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

Discussions similaires

  1. Update sur un champ NOT NULL avec une valeur NULL sans erreur
    Par HectorPriamide dans le forum Requêtes
    Réponses: 8
    Dernier message: 26/01/2012, 21h25
  2. not null avec MDX
    Par magaimono dans le forum SSAS
    Réponses: 3
    Dernier message: 26/05/2008, 15h44
  3. "not null" avec union et order by
    Par cauriera dans le forum Langage SQL
    Réponses: 2
    Dernier message: 10/01/2007, 16h14
  4. [PHPMyAdmin]Problème avec "Not Null" dans mysql 5
    Par Ryan Sheckler dans le forum Requêtes
    Réponses: 4
    Dernier message: 15/12/2005, 14h45
  5. Prb Insert avec Colonne NOT NULL
    Par Sunny dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 10/12/2005, 12h59

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