SQL Server JOIN 和 CASE 语句:常见陷阱
在 SQL Server 2008 R2(及更高版本)中,尝试直接在 CASE
条件中使用 JOIN
语句来定义联接条件可能会导致语法错误。 让我们来看看为什么以及如何解决这个问题。
考虑 sys.partitions
和 sys.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_id
或 a.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.type
或 a.container_id = p.hobt_id
)都为真时,a.container_id = p.partition_id
语句的计算结果为 1。 然后,= 1
比较为 JOIN
条件提供必要的布尔结果。 此修改后的查询正确地连接了表。 此方法可确保 JOIN
条件计算为 true 或 false 值,从而使连接能够按预期运行。
以上是SQL Server 的 JOIN 条件中可以使用 CASE 语句吗?的详细内容。更多信息请关注PHP中文网其他相关文章!