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 :

select conditionnel mysql


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2005
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 78
    Par défaut select conditionnel mysql
    je cherche comment faire un select conditionnel dans un requète mysql.
    Voici mon problème j'ai 3 champs dans ma table adhérents : nom année photo.
    La photo n'est pas disponible pour chaque adhérent.
    Je voudrais faire un" SELECT photo,nom,annee,type FROM adherents " et n'obtenir que les adhérents ayant une photo.
    Comment faire ?

  2. #2
    Membre expérimenté Avatar de Gaara-Manga
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Avril 2007
    Messages : 247
    Par défaut
    Si tu as mis la valeur de ton champ photo par défaut à null sa sera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT photo,nom,annee,type FROM adherents WHERE photo <> Null
    Sinon sa sera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT photo,nom,annee,type FROM adherents WHERE photo <> ''

  3. #3
    Membre confirmé
    Inscrit en
    Août 2005
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 78
    Par défaut
    Citation Envoyé par Gaara-Manga Voir le message
    Si tu as mis la valeur de ton champ photo par défaut à null sa sera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT photo,nom,annee,type FROM adherents WHERE photo <> Null
    Sinon sa sera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT photo,nom,annee,type FROM adherents WHERE photo <> ''
    La deuxième solution répond exactement à mon problème.

  4. #4
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Par défaut
    salut,

    que contient la colonne photo quand une personne n'en a pas? NULL? autre?

  5. #5
    Membre confirmé
    Inscrit en
    Août 2005
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 78
    Par défaut
    Citation Envoyé par Cybher Voir le message
    salut,

    que contient la colonne photo quand une personne n'en a pas? NULL? autre?
    la colonne ne contient rien. J'ai voulu initialiser à NULL mais ça ne marche pas. J'ai pas du prendre les bonnes options dans phpmyadmin.

  6. #6
    Membre Expert

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Par défaut
    Attention NULL n'est pas une valeur mais un marqueur représentant l'abscence même de valeur, à ce titre la norme SQL présente le prédicat IS spécialement fait pour ce marqueur.

    La syntaxe normalisé et donc conseillé serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ...
    FROM ...
    WHERE champ IS [NOT] NULL;
    Notons que la norme présente des faiblesses a l'UPDATE puisque la syntaxe est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE table
    SET champ = NULL;
    A voir le cours de SQLpro sur les nulls

  7. #7
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 065
    Par défaut
    C'est un problème classique d'opérateur dans un langage de programmation ou d'interrogation (le SQL n'est pas le seul d'ailleurs).
    NULL correspondant à l'absence d'information, il ne peut pas être comparé à d'autres valeurs (et les opérateurs de comparaison ne fonctionnent pas avec NULL). D'où la syntaxe avec le mot clef IS dans la condition d'une requête.

    Pour l'update, c'est un peu différent : en SQL, le "=" n'est pas qu'un opérateur de comparaison, c'est aussi l'opérateur d'assignation. On assigne à la donnée une valeur par l'opérateur "=", y compris si cette valeur est la valeur NULL. Ca aurait pu être "<-", mais c'est "=".
    Il ne faut pas confondre ces 2 sens de l'opérateur "=", qui sont en réalité 2 opérations bien distinctes, mais avec le même opérateur...

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  8. #8
    Membre Expert

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Par défaut
    Ce qui me perturbe c'est que le = étant l'opérateur d'affectation dans un SET, il sert à affecter une valeur à un champ, sans faire la différence entre un NULL ou une quelconque valeure.
    Il n'est pas non étonnant de voir beaucoup de débutant (et même plus confirmé) bloquer sur ce genre d'erreur de syntaxe pour peu que la fatigue nous gagne.

    Il aurait été plus cohérent d'avoir une syntaxe du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE TABLE
    SET champ NULL
    ou bien encore

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE TABLE
    SET champ IS NULL
    Dans le deuxième cas l'opérateur IS est déjà un opérateur de test dans le WHERE, mais ça ne semble pas gênant puisque = est présent dans SET et WHERE et est d'une part un prédicat, et d'autre part un opérateur d'affectation.

    Enfin de tout façon on ne va pas refaire le SQL mais je tenais juste à poussé un coup de gueule en souvenir de mes heures perdu sur ce genre de problèmes

Discussions similaires

  1. problème de select en mysql/java
    Par taouja dans le forum JDBC
    Réponses: 8
    Dernier message: 17/04/2007, 09h39
  2. [HQL]select conditionnel avec set
    Par Glum147 dans le forum Hibernate
    Réponses: 4
    Dernier message: 10/11/2006, 15h01
  3. Réponses: 3
    Dernier message: 03/08/2006, 15h06
  4. SELECT avec MYSQL
    Par vinche999 dans le forum Requêtes
    Réponses: 11
    Dernier message: 28/05/2006, 13h08
  5. Problème avec select sous MYSQL
    Par Thomad dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/01/2006, 11h26

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