SQL Server JOIN 条件和 CASE 语句:仔细观察
使用 Microsoft SQL Server 2008 R2 的系统视图(如 sys.partitions
和 sys.allocation_units
)时,它们之间的关系通常取决于 sys.allocation_units.type
值。 连接这些表的常见方法可能涉及 CASE
条件中的 JOIN
语句。
让我们检查一下这个场景:连接 sys.indexes
、sys.partitions
和 sys.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中文网其他相关文章!