首页 >数据库 >mysql教程 >SQL Server JOIN条件中可以直接使用CASE语句吗?

SQL Server JOIN条件中可以直接使用CASE语句吗?

Patricia Arquette
Patricia Arquette原创
2025-01-20 07:36:08799浏览

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

SQL Server JOIN 条件和 CASE 语句:仔细观察

使用 Microsoft SQL Server 2008 R2 的系统视图(如 sys.partitionssys.allocation_units)时,它们之间的关系通常取决于 sys.allocation_units.type 值。 连接这些表的常见方法可能涉及 CASE 条件中的 JOIN 语句。

让我们检查一下这个场景:连接 sys.indexessys.partitionssys.allocation_units 需要基于 allocation_units.type 的条件连接。最初的尝试可能如下所示:

<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>

然而,这会导致语法错误。 该问题源于 SQL Server 中的 CASE 语句生成标量值,而不是可执行语句。 他们无法直接控制 JOIN 子句中的相等比较。

解决方案:使用 CASE 进行布尔计算

要解决这个问题,我们需要重构 CASE 语句以返回一个布尔值(1 表示 true,0 表示 false),然后可以进行比较:

<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>

通过在 AND 子句中使用 WHEN 并将生成的 CASE 表达式与 1 进行比较,我们有效地创建了一个条件连接。 这表明,虽然 CASE 语句功能强大,但在 JOIN 条件下使用它们需要仔细考虑其返回类型以及显式布尔计算的需要。 不支持 CASE 内的 JOIN 语句本身内的直接赋值或相等测试。

以上是SQL Server JOIN条件中可以直接使用CASE语句吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn