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

下面的图片是Microsoft SQL Server 2008 R2系统视图的一部分。从图片中我们可以看到,sys.partitionssys.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语句。 谁能帮助解释一下?


添加错误信息。

Msg 102, Level 15, State 1, Line 6 在'='附近语法不正确。

解决办法

一个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 "是一个数据类型,那么平等测试就有意义了)。

评论(6)

相反,你只需对两个表进行JOIN,并在你的SELECT子句中。 返回匹配的数据。

我建议你通过这个链接SQL Server中的条件连接和https://stackoverflow.com/questions/8361183/t-sql-case-statement-in-a-join-on-clause。

比如说

    SELECT  *
FROM    sys.indexes i
        JOIN sys.partitions p
            ON i.index_id = p.index_id 
        JOIN sys.allocation_units a
            ON a.container_id =
            CASE
               WHEN a.type IN (1, 3)
                   THEN  p.hobt_id 
               WHEN a.type IN (2)
                   THEN p.partition_id
               END 

编辑:根据评论。

你不能像你现在这样指定连接条件。检查上面的 上面的查询,没有错误。我已经把普通列拿出来了 ,右边的列值将在条件下被评估。

评论(9)

试试这个。

...JOIN sys.allocation_units a ON 
  (a.type=2 AND a.container_id = p.partition_id)
  OR (a.type IN (1, 3) AND a.container_id = p.hobt_id)
评论(1)