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 :

Tester si un varchar est vide


Sujet :

Développement SQL Server

  1. #1
    Membre régulier Avatar de kodo
    Profil pro
    Chef de projet technique
    Inscrit en
    Mars 2006
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations professionnelles :
    Activité : Chef de projet technique

    Informations forums :
    Inscription : Mars 2006
    Messages : 300
    Points : 92
    Points
    92
    Par défaut Tester si un varchar est vide
    Bonjour
    je cherche comment tester si un varchar est vide.
    j'ai besoin de ce test dans ma procédure stockée.

    j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if @VALUE <> ''
        SET @REQUETE = @REQUETE + 'AND MATABLE.MACHAINE = '+@VALUE
    Mais mon test ne marche pas meme si VALUE est vide !!!!

    y a t il une fonction qui permet de verifier si un varchar est vide ?

    Merci

  2. #2
    Membre chevronné

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Points : 1 758
    Points
    1 758
    Par défaut
    Bonjour,

    Si vous cherchez a construire dynamiquement une clause where, je vous recommande l'artifice 1=1.
    Utilisant cet artifice vous permet d'eviter de devoir verifier le contenu de votre chaine et par defaut ajouter : AND condition.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Select
    ...
    from
    ...
    where 1 = 1
    AND Condition1
    AND Condition2
    ...
    Pour en revenir a votre question de base, veuillez noter que si votre chaine est NULL, votre condition ne sera jamais vraie. Car '' <> NULL est different de TRUE.

    Bonne journee

  3. #3
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 794
    Points
    4 794
    Par défaut
    Attention il faut écrire :
    pour tester la "nullité" de @VALUE

    si tu écris :
    ça ne marche pas sans donner de message d'erreur - histoire que tu cherches pendant des heures sans comprendre
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  4. #4
    Membre régulier Avatar de kodo
    Profil pro
    Chef de projet technique
    Inscrit en
    Mars 2006
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations professionnelles :
    Activité : Chef de projet technique

    Informations forums :
    Inscription : Mars 2006
    Messages : 300
    Points : 92
    Points
    92
    Par défaut
    Merci beaucoup pour les réponses

  5. #5
    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 : 42
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    J'aurai plutôt testé LEN(@VALUE)

    Népomucène : NULL n'est pas une valeur, mais un marqueur qui signifie l'absence de valeur
    C'est pour ça que l'on doit écrire IS NULL, et pas = NULL.
    Si c'était le cas, la requête suivante retournerait OK :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    IF NULL = NULL
    	PRINT 'OK'
    ELSE
    	PRINT 'KO'
    D'aileurs, le test peut être effectué avec tout autre opérateur arithmétique que égale

    @++

  6. #6
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 794
    Points
    4 794
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NULL n'est pas une valeur, mais un marqueur qui signifie l'absence de valeur
    ... je le sais bien.
    Kodo nous montré dans sa requête qu'il avait des difficultés avec le test d'une valeur nulle.
    J'ai trouvé utile de lui éviter de tomber dans cette autre erreur ...

    Mais en relisant son message, je vois qu'il dit :
    je cherche comment tester si un varchar est vide
    Du coup, je ne sais plus s'il cherche à tester une variable NULL
    ou bien une variable contenant une chaîne de longueur zéro ...

    Explication par un petit 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
    DECLARE @value varchar(20)	-- @value n'a pas reçu de valeur
     
    print '**************************** test avec NULL'
    IF LEN(@value) IS NULL print 'LEN(@value) est NULL' ELSE print 'LEN(@value) n''est pas NULL et contient ' + CAST(LEN(@value) as varchar(5))
    IF @value IS NULL print '@value est NULL' ELSE print '@value n''est pas NULL'
    IF @value = '' print '@value = ''''' ELSE print '@value <> '''''
    print '
     
    '
     
    SET @value = ''			-- @value contient maintenant une chaîne de longueur zéro
    print '**************************** test avec SET @value = '''''
    IF LEN(@value) IS NULL print 'LEN(@value) est NULL' ELSE print 'LEN(@value) n''est pas NULL et contient ' + CAST(LEN(@value) as varchar(5))
    IF @value IS NULL print '@value est NULL' ELSE print '@value n''est pas NULL'
    IF @value = '' print '@value = ''''' ELSE print '@value <> '''''
    Avec comme résultat :
    **************************** test avec NULL
    LEN(@value) est NULL
    @value est NULL
    @value <> ''


    **************************** test avec SET @value = ''
    LEN(@value) n'est pas NULL et contient 0
    @value n'est pas NULL
    @value = ''
    Donc ce qui veut dire qu'on ne fera pas le même test sur une variable NULL ou contenant une chaîne vide.
    Si Kodo n'est pas trop sûr du contenu de sa variable alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    IF  NOT (@Value IS NULL OR @value = '')
    SET @REQUETE = @REQUETE + 'AND MATABLE.MACHAINE = '+@VALUE
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  7. #7
    FMJ
    FMJ est déconnecté
    Membre averti
    Profil pro
    tutu
    Inscrit en
    Octobre 2003
    Messages
    416
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : tutu

    Informations forums :
    Inscription : Octobre 2003
    Messages : 416
    Points : 356
    Points
    356
    Par défaut
    Citation Envoyé par Ptit_Dje Voir le message
    Bonjour,

    Si vous cherchez a construire dynamiquement une clause where, je vous recommande l'artifice 1=1.
    Utilisant cet artifice vous permet d'eviter de devoir verifier le contenu de votre chaine et par defaut ajouter : AND condition.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Select
    ...
    from
    ...
    where 1 = 1
    AND Condition1
    AND Condition2
    ...

    Bonne journee

    Désolé mais je n'ai pas très bien saisi l'intérêt de l'astuce. C'est juste pour avoir une clause Where qui soit pas en false parce que l'une des conditions qui la compose a une valeur nulle ???

  8. #8
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 794
    Points
    4 794
    Par défaut
    Dans une requête construite par concaténation de caractères,
    c'est une astuce pour que la clause WHERE puisse fonctionner dans tous les cas.


    ex : on suppose qu'on va avoir entre zéro et n conditions WHERE:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DECLARE @requete varchar(2000)
    SET @requete = 'SELECT * FROM Matable WHERE 1=1 '
     
    IF Condition1 SET @requete = @requete + ' AND Monchamp1 > 33'
    IF Condition2 SET @requete = @requete + ' AND Monchamp2 <> 1235'
    IF Condition3 SET @requete = @requete + ' AND Monchamp3 < 8888'
     
    EXEC (@requete)
    Le code ci-dessus 'EXEC (@requete)' va fonctionner même si Condition1, Condition2 et Condition3 ne sont pas remplies
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  9. #9
    FMJ
    FMJ est déconnecté
    Membre averti
    Profil pro
    tutu
    Inscrit en
    Octobre 2003
    Messages
    416
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : tutu

    Informations forums :
    Inscription : Octobre 2003
    Messages : 416
    Points : 356
    Points
    356
    Par défaut
    Merci pour la précision

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

Discussions similaires

  1. comment tester si un formulaire est vide?
    Par stéphane_ais2 dans le forum Access
    Réponses: 5
    Dernier message: 22/09/2005, 10h28
  2. [langage] Comment tester si une chaine est vide
    Par |Bio dans le forum Langage
    Réponses: 4
    Dernier message: 04/05/2005, 15h05
  3. Comment tester si un repertoire est vide sous Linux
    Par chouchouappc dans le forum Linux
    Réponses: 3
    Dernier message: 24/02/2005, 12h03
  4. Tester si une table est vide
    Par rsc dans le forum SQL
    Réponses: 2
    Dernier message: 01/07/2004, 16h25
  5. [JDBC]tester si une table est vide
    Par zozolh2 dans le forum JDBC
    Réponses: 5
    Dernier message: 28/05/2004, 09h17

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