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 WHEN avec opérateur IN


Sujet :

Langage SQL

  1. #1
    Membre expérimenté Avatar de bossun
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 359
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 359
    Points : 1 443
    Points
    1 443
    Par défaut CASE WHEN avec opérateur IN
    salut

    j'ai un peu de peine à écrire une requete sql avec un case when dans une clause where...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            select max(ResultsID) from  panorama..PortfolioResults where  ReferenceDate =@vRefDate 
                    and PortfolioID in
                    (CASE WHEN @vPortfolioID='DEVISES' THEN
                           ('LODTERM','DEVSPOT','DEVBLTS')
                        WHEN @vPortfolioID='OBLIG' THEN
                           ('PRIMOBLI','LOTXDER')
                        END)
     
            group by PortfolioID
    Voilà la requete vers quoi j'aimerais tendre mais il n'aime pas trop ce code.

    il me dit " Incorrect syntax near ','."

    est-ce que qqn peut m'aider un peu? je suis sur Sybase 12.5
    il vaut mieux prendre son pied que de se prendre la tête!!

    http://bossun.noxblog.com

  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 comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CASE WHEN PortfolioID IN ('LODTERM','DEVSPOT','DEVBLTS') THEN 'DEVISES'
         WHEN PortfolioID IN ('PRIMOBLI','LOTXDER') THEN 'OBLIG'
         END = @vPortfolioID

  3. #3
    Membre expérimenté Avatar de bossun
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 359
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 359
    Points : 1 443
    Points
    1 443
    Par défaut
    Salut snipah, merci pour ton message..

    j'ai trouvé un workaround.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    (CASE WHEN @vPortfolioID='DEVISES' THEN
                           (select distinct PortfolioID from panorama..PortfolioResults where PortfolioID IN ('SOPTIONS', 'LODTERM','DEVSPOT','DEVBLTS'))
                        WHEN @vPortfolioID='OBLIG' THEN
                          (select distinct PortfolioID from panorama..PortfolioResults where PortfolioID IN ('ABOBLIG', 'PRIMOBLI'))
                        END)
    ça marche bien.

    Par contre ta méthode m'intrigue bcp. je ne l'ai pas encore testée par manque de temps mais j'aimerais savoir un truc.

    Le premier "When" est toujours Vrai dans mon cas... en principe, il n'évalue même pas le seconde test qui est aussi toujours vrai. Je ne suis pas sûr que ta méthode fonctionne.


    en tout cas merci d'avoir pris du temps pour me répondre
    il vaut mieux prendre son pied que de se prendre la tête!!

    http://bossun.noxblog.com

  4. #4
    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
    Votre SELECT revient à sélectionner les valeurs sans passer par la table, ça vous économisera deux accès à la table.
    Je ne connais pas la syntaxe pour Sybase, ça devrait ressembler à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    (CASE WHEN @vPortfolioID='DEVISES' 
               THEN
                  (SELECT 'SOPTIONS' AS PortfolioID UNION ALL SELECT 'LODTERM' UNION ALL SELECT 'DEVSPOT' UNION ALL SELECT 'DEVBLTS')
          WHEN @vPortfolioID='OBLIG' 
               THEN
                 (SELECT 'ABOBLIG' AS PortfolioID UNION ALL SELECT 'PRIMOBLI')
    END)
    Je n'ai pas bien saisi en quoi votre premier test est toujours vrai, et encore moins pourquoi les deux sont toujours vrais, ce qui voudrait dire que @vPortfolioID est à la fois égal à 'OBLIG' et 'DEVISES'.

    Peut être pourriez vous prendre un peu de temps pour nous expliquer en détail ce que vous cherchez à faire.

    Pour ce qui est de mon bout de code, de ce que j'en ai compris, si votre parametre est 'DEVISES', on veut récupérer les lignes dont le portoflioID est dans la liste ('LODTERM','DEVSPOT','DEVBLTS'), et si le parametre est 'OBLIG', on veut récupérer les lignes dont le portfolioID est dans la liste ('PRIMOBLI','LOTXDER').
    L'idée est donc de "remplacer" pour le test les valeurs de PortfolioID de la premiere liste par 'DEVISES', celles de la seconde liste par 'OBLIG', pour les comparer à votre paramètre.

  5. #5
    Membre expérimenté Avatar de bossun
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 359
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 359
    Points : 1 443
    Points
    1 443
    Par défaut
    Je traite des données financières.

    Je suis en train de refaire un projet de reporting. J'ai des requetes existantes que je veux améliorer afin de faciliter la maintenance et l'évolution... Actuellement j'avais des procédure avec du code tout pourri et complétement redondant.

    Ma requete de base est la suivante :

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    IF(@vPortfolioID = 'DEVISES')
    insert into #ResIDs 
    select ResultsID ,max(PartitionCode)  from panorama..MarketSimPartitions where ResultsID in
            (
            select max(ResultsID) from  panorama..PortfolioResults where PortfolioID IN ('SOPTIONS', 'LODTERM','DEVSPOT','DEVBLTS') 
            and ReferenceDate =@vRefDate 
            group by PortfolioID
            )
     and PartitionKeys in ('TOTAL|TOTAL', 'TOTAL|TOTAL|TOTAL')
    group by ResultsID
     
    ELSE IF (@vPortfolioID = 'DEPTAUX')
    insert into #ResIDs 
    select ResultsID ,max(PartitionCode)  from panorama..MarketSimPartitions where ResultsID in
            (
            select max(ResultsID) from  panorama..PortfolioResults where PortfolioID IN ('ABOBLIG', 'PRIMOBLI','LOTXDER')
            and ReferenceDate =@vRefDate 
            group by PortfolioID
            )
    and PartitionKeys in ('TOTAL|TOTAL', 'TOTAL|TOTAL|TOTAL')
    group by ResultsID
     
    ELSE IF (@vPortfolioID = 'OBLIG')
    insert into #ResIDs
    select ResultsID ,max(PartitionCode)  from panorama..MarketSimPartitions where ResultsID in
            (
            select max(ResultsID) from  panorama..PortfolioResults where PortfolioID IN ('ABOBLIG', 'PRIMOBLI')
            and ReferenceDate =@vRefDate 
            group by PortfolioID
            )
    and PartitionKeys in ('TOTAL|TOTAL', 'TOTAL|TOTAL|TOTAL')
    group by ResultsID
    on remarque bien qu'il y a une répétition.

    Ce que je souhaite c'est d'obtenir une seule requete à la place de cet enchainement de if/else if....

    Avant j'ai crié un peu trop vite victoire... le workaround que j'ai trouvé ne fonctionne pas plus que les autres méthodes que j'essayais.

    j espère que c'est plus clair.
    il vaut mieux prendre son pied que de se prendre la tête!!

    http://bossun.noxblog.com

  6. #6
    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
    Je ne suis pas sûr que ça facilite la maintenance ou les évolutions, mais vous pouvez essayer ceci à la place de votre code :
    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
     
    INSERT INTO #ResIDs 
    SELECT ResultsID ,max(PartitionCode)  
    FROM panorama..MarketSimPartitions 
    WHERE ResultsID IN
          (
           SELECT max(ResultsID) 
           FROM  panorama..PortfolioResults 
           WHERE
            CASE WHEN PortfolioID IN ('SOPTIONS', 'LODTERM','DEVSPOT','DEVBLTS') THEN 'DEVISES'
                 WHEN PortfolioID IN ('ABOBLIG', 'PRIMOBLI','LOTXDER') THEN 'DEPTAUX'
                 WHEN PortfolioID IN ('ABOBLIG', 'PRIMOBLI') THEN 'OBLIG'
            END = @vPortfolioID
            AND ReferenceDate =@vRefDate 
           GROUP BY PortfolioID
          )
     AND PartitionKeys IN ('TOTAL|TOTAL', 'TOTAL|TOTAL|TOTAL')
    GROUP BY ResultsID
    Voyez également ce que ça donne coté performances, un éventuel index sur PortfolioID ne serait plus utilisé sur cette requête.

Discussions similaires

  1. CASE WHEN avec hibernate
    Par kinshinori dans le forum Hibernate
    Réponses: 0
    Dernier message: 11/06/2010, 10h54
  2. Utilisation CASE WHEN avec une liste de valeurs
    Par mortimer.pw dans le forum PL/SQL
    Réponses: 5
    Dernier message: 26/03/2009, 12h50
  3. Sql CASE/WHEN avec HyperFile
    Par iniaina dans le forum HyperFileSQL
    Réponses: 5
    Dernier message: 21/11/2008, 10h37
  4. CASE WHEN avec un comportement anormal
    Par damien.sans dans le forum Oracle
    Réponses: 5
    Dernier message: 23/08/2006, 10h03
  5. case/when avec plusieurs valeurs pour le then
    Par Neo41 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 02/09/2005, 15h58

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