137 votes

"CASE" statement dans la clause "WHERE" dans SQL Server 2008

Je travaille avec une requête qui contient une déclaration "CASE" dans la clause "WHERE". Mais SQL Server 2008 renvoie des erreurs lors de son exécution. Est-ce que quelqu'un pourrait m'aider avec la requête correcte ? Voici la requête :

SELECT
    tl.storenum 'Store #', 
    co.ccnum 'FuelFirst Card #', 
    co.dtentered 'Date Entered',
    CASE st.reasonid 
        WHEN 1 THEN 'Actif' 
   WHEN 2 THEN 'Non actif' 
   WHEN 0 THEN st.ccstatustypename 
   ELSE 'Inconnu' 
    END 'Statut',
    CASE st.ccstatustypename 
        WHEN 'Actif' THEN ' ' 
   WHEN 'Non actif' THEN ' ' 
   ELSE st.ccstatustypename 
    END 'Raison',
    UPPER(REPLACE(REPLACE(co.personentered,'RT\\\\',''),'RACETRAC\\\\','')) 'Personne entrée',
    co.comments 'Commentaires ou Notes'
FROM 
    comments co
    INNER JOIN cards cc ON co.ccnum=cc.ccnum
    INNER JOIN customerinfo ci ON cc.customerinfoid=ci.customerinfoid
    INNER JOIN ccstatustype st ON st.ccstatustypeid=cc.ccstatustypeid
    INNER JOIN customerstatus cs ON cs.customerstatuscd=ci.customerstatuscd
    INNER JOIN transactionlog tl ON tl.transactionlogid=co.transactionlogid
    LEFT JOIN stores s ON s.StoreNum = tl.StoreNum
WHERE 
    CASE LEN('TestPerson')
        WHEN 0 THEN co.personentered  = co.personentered
   ELSE co.personentered LIKE '%TestPerson'
    END 
    AND cc.ccnum = CASE LEN('TestFFNum')
        WHEN 0 THEN cc.ccnum 
   ELSE 'TestFFNum' 
    END 
    AND CASE LEN('2011-01-09 11:56:29.327') 
        WHEN 0 THEN co.DTEntered = co.DTEntered 
   ELSE 
       CASE LEN('2012-01-09 11:56:29.327') 
           WHEN 0 THEN co.DTEntered >= '2011-01-09 11:56:29.327' 
      ELSE co.DTEntered BETWEEN '2011-01-09 11:56:29.327' AND '2012-01-09 11:56:29.327' 
       END 
    END
    AND tl.storenum < 699 
ORDER BY tl.StoreNum

2 votes

Cas d'expression, pas d'instruction... (La case d'expression renvoie une valeur. La case d'instruction est utilisée dans les procédures stockées pour l'exécution conditionnelle du code.)

3voto

Rambabu Bommedi Points 21
 sélectionner 
d.DISTNAME,e.BLKNAME,a.childid,a.studyingclass 
de Tbl_AdmissionRegister a
inner join District_master b on a.Schooid=b.Schooid
où
cas lorsque len('3601')=4   alors c.distcd 
           lorsque len('3601')=6   alors c.blkcd  
           lorsque len('3601')=11  alors c.schcd   fin = '3601'

2voto

Sakthivel Points 89

Merci pour cette question, en fait je cherche quelque chose d'autre qui se trouve dans la requête ci-dessous. Cela peut aider quelqu'un.

      SELECT DISTINCT CASE WHEN OPPORTUNITY='' THEN '(BLANK)' ELSE OPPORTUNITY END
  AS OPP,LEN(OPPORTUNITY) FROM [DBO].[TBL]

La requête ci-dessus est utilisée pour remplir une liste déroulante où les valeurs vides s'affichent comme "(vide)". De plus, si nous passons cette valeur dans une clause where SQL pour obtenir les valeurs vides avec d'autres valeurs, je ne sais pas comment gérer cela. Enfin, voici la solution suivante qui peut aider quelqu'un.

Voici la solution,

 DECLARE @OPP TABLE (OPP VARCHAR(100))
  INSERT INTO @OPP VALUES('(BLANK)'),('UNFUNDED'),('FUNDED/NOT COMMITTED')
SELECT DISTINCT [OPPORTUNITY]
FROM [DBO].[TBL]   WHERE    (  CASE WHEN   OPPORTUNITY ='' THEN '(BLANK)' ELSE OPPORTUNITY END IN (SELECT OPP FROM @OPP))
ORDER BY 1

1voto

Anand Points 1206

Vous pouvez également essayer comme ci-dessous par exemple pour afficher uniquement les envois sortants

   SELECT shp_awb_no,shpr_ctry_cd, recvr_ctry_cd,
     CASE WHEN shpr_ctry_cd = record_ctry_cd 
     THEN "O" 
     ELSE "I" 
      END AS route
     FROM shipment_details
    WHERE record_ctry_cd = "JP"
      AND "O" = CASE WHEN shpr_ctry_cd = record_ctry_cd 
                THEN "O" 
                ELSE "I" 
                 END

1voto

user1758901 Points 11
CAS LEN('TestPerson')
    QUAND 0 ALORS co.personentered  = co.personentered SINON co.personentered LIKE '%TestPerson'

Essayez ce qui suit:

... et ( 
    (LEN('TestPerson') = 0 et co.personentered  = co.personentered) ou
    (LEN('TestPerson') <> 0 et co.personentered LIKE '%TestPerson') ) et ...

1voto

Stefan Michev Points 131

Je utilise quelque chose comme ça pour filtrer les utilisateurs selon l'aiguille en tant que chaîne et un menu déroulant dans l'interface utilisateur

où
        u.username like '%' + isnull(@needle, '') + '%'
    et 1 =
    (
        cas 
            lorsque @status = 0            alors 1 -- Tous en uu
            lorsque @status = u.statusid   alors 1 -- Statut spécial
            sinon 0 -- sinon rejet
        fin
    )

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X