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 :

Condition Where avec paramètre = null


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Développeur .NET
    Inscrit en
    Août 2018
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2018
    Messages : 62
    Par défaut Condition Where avec paramètre = null
    Hello hello

    J'aurais besoin d'un petit coup de pouce dans ma requête !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT  ROW_NUMBER() OVER(ORDER BY T0.Doc asc),
    T0.Code
     
    FROM TEST T0 
     
    WHERE T0.Code = '{0}'
    AND T0.Type = '{1}'
    AND T0.Taille = '{2}'
    Mon problème étant que ma requête ne fonctionne pas si '{2}' = NULL . Du coup je voudrais tester dans mon where que si '{2}' est NULL alors ne pas prendre en compte cette condition du where.
    J'ai essayé différentes choses en déclarant des variables et en testant si IS NULL mais ça ne fonctionne pas

    Quelqu'un aurait-il une piste ?

    Merci,
    Pluplume

  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 001
    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 001
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND COALESCE(T0.Taille, 0) = COALESCE('{2}', 0)
    Par exemple !

    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
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 613
    Billets dans le blog
    10
    Par défaut
    un attribut n'est jamais égal à nul, il peut par contre être marqué nul, ce n'est pas la même chose.
    "nul" est un indicateur signifiant que la valeur est inconnue, ce n'est donc pas une valeur, c'est même exactement le contraire : une absence de valeur

  4. #4
    Membre confirmé
    Femme Profil pro
    Développeur .NET
    Inscrit en
    Août 2018
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2018
    Messages : 62
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    un attribut n'est jamais égal à nul, il peut par contre être marqué nul, ce n'est pas la même chose.
    "nul" est un indicateur signifiant que la valeur est inconnue, ce n'est donc pas une valeur, c'est même exactement le contraire : une absence de valeur
    Merci pour ta réponse mais ça me laisse un peu perplexe
    Tu dis une absence de valeur du coup j'en déduis qu'il faut utilisé IS NULL mais je pense que ma construction n'est pas correcte...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    DECLARE @Test
    Set @Test = '{2}'
    SELECT  ROW_NUMBER() OVER(ORDER BY T0.Doc asc),
    T0.Code
     
    FROM TEST T0 
     
    WHERE T0.Code = '{0}'
    AND T0.Type = '{1}'
    AND T0.Taille = '{2}' OR @Test IS NULL

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Attention à l'ordre de précédences des opérateurs quand vous mixez AND et OR, le premier étant prioritaire sur le second.

    Ce que vous avez écrit dans votre clause WHERE est ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    WHERE ( T0.Code   = '{0}'
      AND   T0.Type   = '{1}'
      AND   T0.Taille = '{2}' )
       OR   @Test    IS NULL
    Et j'ai l'impression que vous vouliez plutôt ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    WHERE   T0.Code   = '{0}'
      AND   T0.Type   = '{1}'
      AND ( T0.Taille = '{2}'
       OR   @Test    IS NULL )

  6. #6
    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
    Par défaut
    vous êtes sur la bonne voie !

    mais attention à la précédence des opérateurs : AND est prioritaire sur OR, donc votre requête correspond à (si on ajoute les parenthèses implicites)

    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
     
     
    DECLARE @Test
    Set @Test = '{2}'
    SELECT  ROW_NUMBER() OVER(ORDER BY T0.Doc asc),
    T0.Code
     
    FROM TEST T0 
     
    WHERE (
        T0.Code = '{0}'
        AND T0.Type = '{1}'
        AND T0.Taille = '{2}' 
    )
        OR @Test IS NULL
    il faudrait donc ajouter des parenthèses pour avoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    DECLARE @Test
    Set @Test = '{2}'
    SELECT  ROW_NUMBER() OVER(ORDER BY T0.Doc asc),
    T0.Code
     
    FROM TEST T0 
     
    WHERE T0.Code = '{0}'
    AND T0.Type = '{1}'
    AND (T0.Taille = '{2}' OR @Test IS NULL)

  7. #7
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 959
    Par défaut
    Bonjour,

    Je rebondi sur :
    Citation Envoyé par Pluplume Voir le message
    Mon problème étant que ma requête ne fonctionne pas si '{2}' = NULL
    NULL est d'être à la fois "indéfini" (type de donnée) et "indéterminé" (valorisation).
    Une verbalisation du bonhomme possible est de dire que c'est la représentation de "ne sait pas"

    Du coup on comprend que la conditionnelle : variable = null
    n'a pas de sens
    On peut tout à la fois répondre que celle ci est toujours vrai ou toujours fausse (le choix s'est porté sur toujours fausse)

    La conditionnelle retenue en SQL est : variable IS null
    IS étant un opérateur de l'état null

    Du point de vue de l'apprenant ceci semble être une complexité inutile.
    Mais une attention un peu plus poussée permet d'en comprendre la nécessité.

  8. #8
    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
    Par défaut
    Bonjour,

    Citation Envoyé par Michel.Priori Voir le message
    Du coup on comprend que la conditionnelle : variable = null
    n'a pas de sens
    On peut tout à la fois répondre que celle ci est toujours vrai ou toujours fausse (le choix s'est porté sur toujours fausse)
    en fait non, ce n'est pas faux non plus !
    Le résultat du test d'égalité n'est ni vrai ni faux, mais "inconnu" (logique tri valuée)

    si le résultat de variable = null était faux, alors NOT variable = null serait vrai, ce qui n'est pas le cas non plus.

Discussions similaires

  1. Condition Where avec valeur de la meme table
    Par pelloq1 dans le forum Requêtes
    Réponses: 4
    Dernier message: 27/04/2009, 15h22
  2. [2K5] Actualisation liste avec paramètre NULL
    Par Lolomenfin dans le forum SSRS
    Réponses: 1
    Dernier message: 28/02/2009, 11h36
  3. [Axis 2] : pb appel web services avec paramètre à null
    Par Foub dans le forum Services Web
    Réponses: 1
    Dernier message: 06/01/2009, 07h31
  4. Réponses: 2
    Dernier message: 16/06/2007, 12h37
  5. [Hibernate] Insertion avec paramètres null
    Par kephy dans le forum Hibernate
    Réponses: 5
    Dernier message: 14/02/2007, 09h22

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