“L'AFFAIRE” de la déclaration dans les clause “where” dans SQL Server 2008
Je travaille avec une requête qui contient des "CAS" de la déclaration dans les clause "where". Mais SQL Server 2008 est de donner quelques erreurs lors de l'exécution d'elle. Quelqu'un peut-il m'aider avec la requête appropriée? 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
- Cas de l'expression, pas de déclaration... (Le cas de l'expression retourne une valeur. L'instruction de cas est utilisée dans des procédures stockées pour l'exécution conditionnelle de code.)
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, le
CASE
déclaration doit être partie de l'expression, et non pas l'expression elle-même.En d'autres termes, vous pouvez avoir:
Mais il ne fonctionne pas de la manière que vous les avez écrites par exemple:
Vous pouvez avoir plus de chance à l'aide de combinés OU consolidés comme ceci:
Bien que, de toute façon, je ne suis pas sûr de savoir comment grand d'un plan de requête que vous allez obtenir. Ces types de manigances dans un
WHERE
clause empêche souvent l'optimiseur de requête à partir de l'utilisation des index.co.personentered
n'est pas nulle, dans l'option 1 et 2. Maintenant 3 ème option est assez. Mais je veux savoir que...!!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 qu'il n'est pas une bonne approche :
Essayez ce qui suit:
Je pense que le début de votre requête devrait ressembler à ça:
MAIS
ce qui est dans la queue n'est pas du tout compréhensible
Il
WHERE
partie pourrait être écrit comme ceci:Merci pour cette question, en fait je suis à la recherche de quelque chose d'autre qui est en-dessous de la requête. cela peut aider quelqu'un.
requête ci-dessus est à remplir dans la liste déroulante qui vide les valeurs montre que "(vide)". Aussi, si l'on passe cette valeur dans la clause sql where pour obtenir les valeurs vides avec d'autres valeurs, je ne sais pas comment gérer cela. Et enfin est venu avec ci-dessous la solution de ce qui peut aide à quelqu'un.
ici, il est ,
voici ma solution
Regads
Davy
Cela fonctionne
Vous pouvez également essayer comme ci-dessous par exemple. pour afficher uniquement les Envois Sortants
Utiliser de cette manière.