小编典典

我可以在 JOIN 条件中使用 CASE 语句吗?

all

下图是 Microsoft SQL Server 2008 R2
系统视图的一部分。sys.partitions从图中我们可以看出和之间的关系sys.allocation_units取决于
的值sys.allocation_units.type。因此,要将它们连接在一起,我会写一些类似的东西:

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

但是上面的代码给出了语法错误。我想那是因为CASE声明。谁能帮忙解释一下?


添加错误信息:

消息 102,级别 15,状态 1,第 6 行 ‘=’ 附近的语法不正确。

这是图像


阅读 84

收藏
2022-08-08

共1个答案

小编典典

CASE表达式从子句的一部分返回一个值THEN。你可以这样使用它:

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

请注意,您需要对返回的值做一些事情,例如将其与 1
进行比较。您的语句试图返回赋值或测试相等性的值,这在CASE/THEN子句的上下文中都没有意义。(如果BOOLEAN是数据类型,那么相等性的测试是有意义的。)

2022-08-08