Clause WHERE de SQL Server 2008 : utilisation appropriée de l'instruction CASE
L'utilisation d'instructions CASE dans les clauses WHERE de SQL Server 2008 exige une syntaxe précise pour une exécution correcte. Ce qui suit illustre les erreurs courantes et leurs solutions.
Un exemple de placement incorrect d'une instruction CASE dans une clause WHERE :
<code class="language-sql">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 </code>
Le problème est la tentative d'attribuer des valeurs dans l'instruction CASE en utilisant =
ou LIKE
. L'instruction CASE doit être utilisée pour la génération de valeur conditionnelle, et non pour l'affectation. L'approche corrigée utilise la logique booléenne :
<code class="language-sql">WHERE (LEN('TestPerson') = 0 AND co.personentered = co.personentered) OR (LEN('TestPerson') > 0 AND co.personentered LIKE '%TestPerson')</code>
Cette requête révisée évalue correctement les conditions en fonction de la longueur de « TestPerson ».
Les comparaisons de dates nécessitent également un examen attentif. Au lieu de plusieurs instructions CASE imbriquées, l'utilisation de conditions OR distinctes est souvent plus claire et plus efficace :
<code class="language-sql">WHERE (LEN('2011-01-09 11:56:29.327') = 0 AND co.DTEntered = co.DTEntered) OR (LEN('2011-01-09 11:56:29.327') > 0 AND LEN('2012-01-09 11:56:29.327') = 0 AND co.DTEntered >= '2011-01-09 11:56:29.327') OR (LEN('2011-01-09 11:56:29.327') > 0 AND LEN('2012-01-09 11:56:29.327') > 0 AND co.DTEntered BETWEEN '2011-01-09 11:56:29.327' AND '2012-01-09 11:56:29.327')</code>
En employant ces syntaxes corrigées, vos requêtes SQL Server 2008 incorporant des instructions CASE dans les clauses WHERE s'exécuteront comme prévu.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!