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

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

Susan Sarandon
发布: 2025-01-20 07:17:08
原创
812 人浏览过

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

SQL Server JOIN 和 CASE 语句:常见陷阱

在 SQL Server 2008 R2(及更高版本)中,尝试直接在 CASE 条件中使用 JOIN 语句来定义联接条件可能会导致语法错误。 让我们来看看为什么以及如何解决这个问题。

考虑 sys.partitionssys.allocation_units 之间的关系,其中连接取决于 sys.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>
登录后复制

这会导致错误“'='附近的语法不正确”。 问题是 CASE 表达式本身不会产生适合连接条件的布尔值 (TRUE/FALSE) 结果。 相反,它返回 a.container_id = p.hobt_ida.container_id = p.partition_id,这两者本身都不是有效的连接条件。

正确的方法:布尔求值

要解决此问题,我们需要 CASE 表达式来生成布尔值。 我们可以通过构建 CASE 语句来实现此目的,以返回 1(表示 true)和 0(表示 false),然后将结果与 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>
登录后复制

现在,仅当适当的条件(基于 CASE)和相等性检查(a.typea.container_id = p.hobt_id)都为真时,a.container_id = p.partition_id 语句的计算结果为 1。 然后,= 1 比较为 JOIN 条件提供必要的布尔结果。 此修改后的查询正确地连接了表。 此方法可确保 JOIN 条件计算为 true 或 false 值,从而使连接能够按预期运行。

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板