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

MS SQL Server Discussion :

CASE dans un IF EXISTS


Sujet :

MS SQL Server

  1. #1
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Points : 233
    Points
    233
    Par défaut CASE dans un IF EXISTS
    Bonjour à tous,

    J'essaie d'évaluer l'expression suivante dans une procédure stockée, toutefois cela ne semble pas permis. Est-ce normal ?

    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
     
    DECLARE @Valeur VARCHAR(40) -- Paramètre de procédure stockée
    SET @Valeur = NULL          -- Simuler le paramètre
     
    IF EXISTS
    (
         CASE 
               WHEN @Valeur IS NULL THEN
                    SELECT * 
                    FROM ??? 
                    WHERE ??? = ??? 
                              AND ??? = ???
                              AND ??? = ???
               ELSE
                    SELECT * 
                    FROM ??? 
                    WHERE ??? = ??? 
                              AND ??? = ???
         END
    )
    BEGIN
           PRINT 'Action à entreprendre....'
    END
    Est-ce possible de réaliser cette condition ?

  2. #2
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Points : 233
    Points
    233
    Par défaut
    C'est ridicule, mais la seule façon que j'ai pu trouver pour tester la condition est de faire 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    DECLARE @Valeur VARCHAR(40) -- Paramètre de procédure stockée
    SET @Valeur = NULL          -- Simuler le paramètre
     
    DECLARE @NombreDeLigne INT
    IF @Valeur IS NULL
    BEGIN
       SELECT @NombreDeLigne = COUNT(*)
       FROM ??? 
       WHERE ??? = ??? 
             AND ??? = ???
             AND ??? = ???
     END
    ELSE
    BEGIN
       SELECT @NombreDeLigne = COUNT(*)
       FROM ??? 
       WHERE ??? = ??? 
             AND ??? = ???
    END
     
    IF @NombreDeLigne > 0
    BEGIN
       ...
    END
    J'aurais de loin apprécié que la première méthode (mentionné dans le poste précédante), fonctionne!

    Car le fait d'utilisé un COUNT(*) ici, est un peu inutile et surtout moins performant pour les besions de la cause. Je ne veux pas savoir le nombre exacte, mais seulement s'il y en existe.

    Bref, si vous avez une autre idée, je suis BIEN ouvert, surtout si c'est plus simple

  3. #3
    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 : 43
    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,

    Vous ne pouvez pas utiliser CASE comme vous l'avez fait.
    Regardez les exemples fournis dans l'aide de SQL Server que vous pouvez télécharger ou consulter à partir des liens qui sont dans ma signature.

    Essayez :

    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
    DECLARE @Valeur VARCHAR(40) -- Paramètre de procédure stockée, pas besoin de le mettre à NULL, il l'est déjà s'il n'a jamais été affecté
     
    IF EXISTS
    (
    	SELECT * 
    	FROM ??? 
    	WHERE ??? = ??? 
    	AND ??? = ???
    	AND ??? = ???
    	AND @Valeur IS NULL
    )
    OR EXISTS
    (
    	SELECT * 
    	FROM ??? 
    	WHERE ??? = ??? 
    	AND ??? = ???
    	AND @Valeur IS NOT NULL
    )
    BEGIN
           PRINT 'Action à entreprendre....'
    END
    @++

  4. #4
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Bonjour Erakis,

    Aller une autre solution qui correspondra surement à votre besoin :

    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
    DECLARE @Valeur VARCHAR(40) -- Paramètre de procédure stockée
    SET @Valeur = NULL          -- Simuler le paramètre
     
    IF 
    (
      SELECT
       CASE WHEN @Valeur IS NULL THEN (SELECT COUNT(1)
                                                 FROM ??? 
                                                 WHERE ??? = ???
                                                   AND ??? = ???
                                                    AND ??? = ???)
               ELSE (SELECT COUNT(1) 
                        FROM ??? 
                        WHERE ??? = ???
                          AND ??? = ???
                           AND ??? = ???)      
       END
    ) > 0          
    BEGIN
           PRINT 'Action à entreprendre....'
    END
    ++

  5. #5
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Points : 233
    Points
    233
    Par défaut
    elsuket :
    Merci pour votre aide, toutefois cette solution n'est pas possible pour moi.
    Puisque cela doit être UNE ou l'AUTRE mais pas les deux. La raison c'est
    que dans une des deux conditions, il y a des SUBSTRING d'utilisé et cela ne
    doit pas être réalisé sur un NULL.

    mikedavem :
    Merci beaucoup, c'est mieux que ce que j'ai trouvé jusqu'ici

Discussions similaires

  1. ajouter un champ dans une table existant
    Par zidenne dans le forum Bases de données
    Réponses: 3
    Dernier message: 29/10/2005, 21h27
  2. [java]probleme de case dans switch
    Par mousstik dans le forum Langage
    Réponses: 8
    Dernier message: 19/09/2005, 16h27
  3. taille dynamique des cases dans état
    Par exter666 dans le forum Access
    Réponses: 14
    Dernier message: 09/09/2005, 15h30
  4. Réponses: 6
    Dernier message: 26/01/2003, 13h45

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