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.)

0voto

user1780042 Points 11

Voici ma solution

ET CLI.PE_NOM Like '%' + ISNULL(@NomClient, CLI.PE_NOM) + '%'

Cordialement Davy

0voto

user7640374 Points 1

Cela fonctionne

declare @v int=A
select * from Table_Name where XYZ=202 
et 
dbkey=(case @v  quand A alors 'Certaine Valeur 1'
sinon 'Certaine Valeur 2'
fin)

-1voto

anurag Points 1
select TUM1.userid,TUM1.first_name + ' ' +TUM1.last_name as NAME,tum1.Business_Title,TUM1.manager_id,tum2.First_Name + ' ' + tum2.Last_Name as [NOM DU MANAGER],TUM1.project,TUM1.project_code,TUM1.rcc_code,TUM1.department,TCM.Company_Name,
case 
when tum1.Gender_ID=1 then 'homme' 
else 'femme' 
end 'SEXE'
,tum1.Band as BAND,
case when tum1.Inactive=0 then 'ENCORE DANS L'ENTREPRISE'
else 'PARTI DE L'ENTREPRISE' 
end 'ACTIF/INACTIF'
from tbl_user_master TUM1
join tbl_Company_Master TCM on TCM.Company_Code=TUM1.Company_Code 
join tbl_User_Master TUM2 on TUM1.Manager_ID=TUM2.UserID 
where tum1.UserID in ('54545414')

-3voto

Shiv Points 1
SÉLECTIONNER * de TABLE
              OÙ 1 = CAS lorsque TABLE.col = 100 alors 1
                     lorsque TABLE.col = 200 alors 2 sinon 3 FIN
                  et TABLE.col2 = 'monnom';

Utilisez de cette manière.

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