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

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

Patricia Arquette
Libérer: 2025-01-20 07:36:08
original
799 Les gens l'ont consulté

Can CASE Statements Be Used Directly in JOIN Conditions in SQL Server?

Conditions JOIN de SQL Server et instructions CASE : un examen plus approfondi

Lorsque vous travaillez avec les vues système de Microsoft SQL Server 2008 R2, comme sys.partitions et sys.allocation_units, la relation entre elles dépend souvent de la valeur sys.allocation_units.type. Une approche courante pour joindre ces tables pourrait impliquer une instruction CASE dans la condition JOIN.

Examinons ce scénario : la connexion de sys.indexes, sys.partitions et sys.allocation_units nécessite une jointure conditionnelle basée sur allocation_units.type. Une première tentative 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>
Copier après la connexion

Ceci entraîne cependant une erreur de syntaxe. Le problème vient du fait que les instructions CASE dans SQL Server produisent des valeurs scalaires, et non des instructions exécutables. Ils ne peuvent pas contrôler directement la comparaison d'égalité dans la clause JOIN.

La solution : évaluation booléenne avec CASE

Pour résoudre ce problème, nous devons restructurer l'instruction CASE pour renvoyer une valeur booléenne (1 pour vrai, 0 pour faux) qui peut ensuite être comparée :

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

En utilisant AND dans les clauses WHEN et en comparant l'expression CASE résultante à 1, nous créons effectivement une jointure conditionnelle. Cela démontre que même si les instructions CASE sont puissantes, leur utilisation dans les conditions JOIN nécessite un examen attentif de leur type de retour et la nécessité d'une évaluation booléenne explicite. L'affectation directe ou les tests d'égalité au sein de l'instruction CASE elle-même au sein d'un JOIN ne sont pas pris en charge.

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!

source:php.cn
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal