Je travaille avec une requête qui contient une instruction "CASE" dans la clause "WHERE". Mais SQL Server 2008 donne des erreurs lors de son exécution. Quelqu'un peut-il s'il vous plaît m'aider avec la bonne requête? Voici la requête:
SELECT
tl.storenum 'Store #',
co.ccnum 'FuelFirst Card #',
co.dtentered 'Date Entered',
CASE st.reasonid
WHEN 1 THEN 'Active'
WHEN 2 THEN 'Not Active'
WHEN 0 THEN st.ccstatustypename
ELSE 'Unknown'
END 'Status',
CASE st.ccstatustypename
WHEN 'Active' THEN ' '
WHEN 'Not Active' THEN ' '
ELSE st.ccstatustypename
END 'Reason',
UPPER(REPLACE(REPLACE(co.personentered,'RT\\\\',''),'RACETRAC\\\\','')) 'Person Entered',
co.comments 'Comments or 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
sql
sql-server
case
user1018213
la source
la source
Réponses:
Tout d'abord, l'
CASE
instruction doit faire partie de l'expression, pas l'expression elle-même.En d'autres termes, vous pouvez avoir:
Mais cela ne fonctionnera pas comme vous les avez écrits, par exemple:
Vous pourriez avoir plus de chance en utilisant des instructions OR combinées comme celle-ci:
Quoi qu'il en soit, je ne suis pas sûr de la qualité du plan de requête que vous obtiendrez. Ces types de manigances dans une
WHERE
clause empêcheront souvent l'optimiseur de requêtes d'utiliser les index.la source
co.personentered
n'est pas nul, dans les options 1 et 2. Maintenant, la troisième option suffit. Mais je veux savoir ça ... !!where case c when 1 then (DescriptionCode is null) else descriptioncode is not null end
, mais je montre l'erreur commeIncorrect syntax near the keyword 'is'.
Cela devrait résoudre votre problème pour le moment, mais je dois vous rappeler que ce n'est pas une bonne approche:
la source
Essayez ce qui suit:
la source
Je pense que le début de votre requête devrait ressembler à ceci:
MAIS
ce qu'il y a dans la queue est complètement incompréhensible
la source
Une
WHERE
partie pourrait être écrite comme ceci:la source
Vous pouvez également essayer comme ci-dessous, par exemple. pour afficher uniquement les envois sortants
la source
Merci pour cette question, en fait je recherche autre chose qui se trouve dans la requête ci-dessous. cela peut aider quelqu'un.
La requête ci-dessus consiste à remplir la liste déroulante dont les valeurs vides apparaissent comme "(vide)". Aussi, si nous passons cette valeur dans la clause sql where pour obtenir des valeurs vides avec d'autres valeurs, je ne sais pas comment gérer cela. Et finalement est venu avec la solution ci-dessous, cela peut aider quelqu'un.
C'est ici ,
la source
voici ma solution
Regads Davy
la source
Cela marche
la source
Essayez ce qui suit:
la source
la source
Utilisez de cette manière.
la source