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

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

    Informations forums :
    Inscription : Août 2007
    Messages : 120
    Points : 82
    Points
    82
    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
    Y a des jours, faut pas me chercher... et y a des jours tous les jours !

  2. #2
    Membre éprouvé
    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
    Points : 965
    Points
    965
    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 émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    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)

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

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

    Informations forums :
    Inscription : Août 2007
    Messages : 120
    Points : 82
    Points
    82
    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 !

    Y a des jours, faut pas me chercher... et y a des jours tous les jours !

  5. #5
    Membre éprouvé
    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
    Points : 965
    Points
    965
    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 régulier Avatar de Blaede
    Profil pro
    Inscrit en
    Août 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 120
    Points : 82
    Points
    82
    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
    Y a des jours, faut pas me chercher... et y a des jours tous les jours !

  7. #7
    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,

    La requête suivante ne serait elle pas plus simple ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT *
    FROM t
    WHERE (@X IN (10,11) AND X IN (10,11))
              OR (@X NOT IN (10,11) AND X = @X)
    ++

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

    Informations forums :
    Inscription : Août 2007
    Messages : 120
    Points : 82
    Points
    82
    Par défaut
    Ce serait beaucoup plus simple mais ça ne fonctionnerait pas si @X est NULL.

    Si l'utilisateur ne définit pas le paramètre @X, je veux que la requête retourne toutes les lignes (WHERE X = X), hors si @X est NULL, ta query ne renverra rien du tout puisque WHERE X = @X ne sera jamais vrai (X n'est jamais null)...
    Y a des jours, faut pas me chercher... et y a des jours tous les jours !

  9. #9
    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
    Dsl, je n'avais pas compris que pour @X étant null la totalité des données de la table devait être renvoyée.

    Ceci donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *
    FROM t
    WHERE (@X IN (10,11) AND X IN (10,11))
     OR (@X NOT IN (10,11) AND X = @X)
     OR (@X IS NULL)
    ++

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

    Informations forums :
    Inscription : Août 2007
    Messages : 120
    Points : 82
    Points
    82
    Par défaut
    Merci
    Y a des jours, faut pas me chercher... et y a des jours tous les jours !

+ 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