Maison >base de données >tutoriel mysql >Les instructions CASE peuvent-elles être utilisées dans les conditions JOIN dans SQL Server ?

Les instructions CASE peuvent-elles être utilisées dans les conditions JOIN dans SQL Server ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-20 07:17:08898parcourir

Can CASE Statements Be Used in JOIN Conditions in 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn