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

Langage SQL Discussion :

Case dans une clause where


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Blaede
    Profil pro
    Inscrit en
    Août 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 120
    Par défaut Case dans une clause where
    Salutations,

    Pourriez-vous m'aider à écrire la query suivante ?

    J'ai une table avec un champs X de type varchar(2). J'écris une procédure stockée qui reçoit un @X en paramètre mais ce dernier peut être null.

    Je voudrais écrire un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM TABLE WHERE X = @X
    Sachant que si @X est null, il faut que le select me ramène tout le contenu de la table, j'en arrive à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM TABLE WHERE X = isnull(@X, X)
    Là où je bloque, c'est que si @X vaut 10, je veux que le select me ramène l'ensemble des records pour lesquels X est égal à 10 OU 11 et de la même façon, si @X vaut 11, je veux l'ensemble des records pour lesquels X est égal à 10 OU 11.

    Une idée ?

    Je vous remercie d'avance,
    Blaede

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Par défaut
    Bonjour,

    Peut être pas le plus simple, mais ça fonctionne en attendant mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select * from t
    where (X = coalesce(CASE WHEN @X='10' THEN '11' ELSE @X END,X) OR X = coalesce(CASE WHEN @X='11' THEN '10' ELSE @X END,X))

  3. #3
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Salut !

    Juste pour rigoler, si x est un entier, tu peux écrire la condition :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHERE coalesce((@x - x) * (11 - exp(@x - 10) * x) * (10 - exp(@x - 11) * x), 0) = 0
    ... car e est transcendant


    (Ok, je sors)

  4. #4
    Membre confirmé Avatar de Blaede
    Profil pro
    Inscrit en
    Août 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 120
    Par défaut
    Merci beaucoup !

    Je ne connaissais pas la fonction coalesce (non pas que j'y aurais pensé si c'était le cas mais comme ça j'ai appris quelque chose en plus d'avoir la solution à mon problème).

    Heureusement pour moi X n'est pas un nombre et je n'ai donc pas besoin d'essayer de comprendre ta solution paccman !


  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Par défaut
    En fait, coalesce est un equivalent de ISNULL.
    Les différences : coalesce fait partie de la norme SQL (et est donc portable sur la plupart des SGBD), et accepte plus de deux arguments.
    Aussi, de ce que j'ai pu en lire, bien qu'en théorie on prendra le soin de pas mélanger les types :
    * ISNULL() effectue une conversion du deuxième argument sur le type du premier
    * COALESCE() effectue une conversion de tous ses arguments sur le type le plus large.
    En bref, mieux vaut utiliser coalesce.

  6. #6
    Membre confirmé Avatar de Blaede
    Profil pro
    Inscrit en
    Août 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 120
    Par défaut
    Arf j'ai un autre problème...

    Le coalesce fonctionne très bien, sauf quand je l'insère dans mon sql dynamique...

    Voilà en gros ce que j'ai :

    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
    DECLARE @mySql NVARCHAR(4000)
    SET @mySql = ''
     
    SET @mySql = 
         N'	SELECT * INTO ##temp
    	FROM (
    		SELECT * FROM ' + @tbl1 + '
    		WHERE
    		X = (coalesce(CASE WHEN ''' + @X + ''' = ''10'' THEN ''11''
    		                             ELSE ''' + @X + '''
    	                                     END, X)
    		OR  X = coalesce(CASE WHEN ''' + @X + ''' = ''11'' THEN ''10''
    					     ELSE ''' + @X + '''
    					  END, X)'
     
    EXEC sp_executesql @mySql

    Si j'assigne une valeur à @X, ça fonctionne, mais si @X est NULL et que
    j'exécute ce code, il me dit invalid object name ##temp

    Quelqu'un pourrait me dire pq le sql dynamique n'aime pas les valeurs nulles ?

    Merci d'avance,
    Blaede

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

Discussions similaires

  1. Utiliser un alias de colonne dans une clause Where MS SQL
    Par sir dragorn dans le forum Langage SQL
    Réponses: 11
    Dernier message: 12/10/2011, 09h31
  2. [SQL2K][TSQL] Peut-on utiliser un alias dans une clause Where ?
    Par StormimOn dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 23/05/2006, 09h25
  3. Réponses: 1
    Dernier message: 03/02/2006, 12h35
  4. fonction booleenne dans une clause where ?
    Par user_h dans le forum Oracle
    Réponses: 1
    Dernier message: 20/10/2005, 15h05

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