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
Libérer: 2025-01-20 07:17:08
original
901 Les gens l'ont consulté

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 :

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
Copier après la connexion

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 :

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
Copier après la connexion

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 de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal