首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我可以在连接条件中使用CASE语句吗?

我可以在连接条件中使用CASE语句吗?
EN

Stack Overflow用户
提问于 2012-04-21 14:33:34
回答 10查看 568.9K关注 0票数 168

下图是Microsoft SQL Server2008 R2系统视图的一部分。从图中我们可以看到,sys.partitionssys.allocation_units之间的关系取决于sys.allocation_units.type的值。因此,为了将它们结合在一起,我会编写类似下面这样的代码:

代码语言:javascript
复制
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行'=‘附近的语法不正确。

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2012-04-21 23:26:25

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

代码语言:javascript
复制
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是一种数据类型,那么相等测试就有意义了。)

票数 263
EN

Stack Overflow用户

发布于 2012-04-21 14:41:48

相反,

只需连接这两个表,并在SELECT子句中从匹配的表中返回数据:

我建议你通过这个链接Conditional Joins in SQL ServerT-SQL Case Statement in a JOIN ON Clause

例如:

代码语言:javascript
复制
    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 

编辑:根据评论。

您不能像现在这样指定联接条件..检查上面没有错误的查询。我已经去掉了公共列,右边的列值将在condition.

上求值。

票数 45
EN

Stack Overflow用户

发布于 2012-04-21 14:40:37

试试这个:

代码语言:javascript
复制
...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)
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10256848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档