Maison >base de données >tutoriel mysql >Les instructions CASE peuvent-elles être utilisées dans les conditions JOIN dans SQL Server ?
SQL Server JOIN et instructions CASE : un piège courant
Dans SQL Server 2008 R2 (et versions ultérieures), tenter d'utiliser une instruction CASE
directement dans une condition JOIN
pour définir les critères de jointure peut entraîner des erreurs de syntaxe. Examinons pourquoi et comment résoudre ce problème.
Considérez la relation entre sys.partitions
et sys.allocation_units
, où la jointure dépend de la valeur sys.allocation_units.type
. Une approche naïve pourrait ressembler à ceci :
<code class="language-sql">SELECT * FROM sys.indexes i JOIN sys.partitions p ON i.index_id = p.index_id JOIN sys.allocation_units a ON CASE WHEN a.type IN (1, 3) THEN a.container_id = p.hobt_id WHEN a.type IN (2) THEN a.container_id = p.partition_id END</code>
Cela entraîne l'erreur "Syntaxe incorrecte près de '='". Le problème est que l'expression CASE
elle-même ne produit pas de résultat booléen (VRAI/FAUX) adapté à une condition de jointure. Au lieu de cela, il renvoie a.container_id = p.hobt_id
ou a.container_id = p.partition_id
, dont aucun n'est une condition de jointure valide en soi.
La bonne approche : évaluation booléenne
Pour résoudre ce problème, nous avons besoin de l'expression CASE
pour générer une valeur booléenne. Nous pouvons y parvenir en structurant l'instruction CASE
pour qu'elle renvoie 1 pour vrai et 0 pour faux, puis en comparant le résultat à 1 :
<code class="language-sql">SELECT * FROM sys.indexes i JOIN sys.partitions p ON i.index_id = p.index_id JOIN sys.allocation_units a ON CASE WHEN a.type IN (1, 3) AND a.container_id = p.hobt_id THEN 1 WHEN a.type IN (2) AND a.container_id = p.partition_id THEN 1 ELSE 0 END = 1</code>
Maintenant, l'instruction CASE
est évaluée à 1 uniquement lorsque les conditions appropriées (basées sur a.type
) et la vérification d'égalité (a.container_id = p.hobt_id
ou a.container_id = p.partition_id
) sont toutes deux vraies. La comparaison = 1
fournit alors le résultat booléen nécessaire pour la condition JOIN
. Cette requête révisée joint correctement les tables. Cette méthode garantit que la condition JOIN
est évaluée à une valeur vraie ou fausse, permettant à la jointure de fonctionner 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!