当前位置: 首页 > 知识库问答 >
问题:

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

景星光
2023-03-14

下图是Microsoft SQL Server 2008 R2系统视图的一部分。从图中我们可以看到sys之间的关系。分区系统。分配单位取决于系统的值。分配单位。键入。因此,为了将它们结合在一起,我会写一些类似的东西:

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 

但是上面的代码给出了一个语法错误。我想那是因为案例陈述。谁能帮我解释一下吗?

添加错误消息:

Msg 102,15级,状态1,第6行“=”附近的语法不正确。

共有3个答案

艾灿
2023-03-14

试试这个:

...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)
巩子实
2023-03-14

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

我建议您在SQL Server中使用此链接条件联接,并在JOIN ON子句中使用T-SQL Case语句

例如

    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 

编辑:根据评论。

您不能像现在这样指定联接条件。。检查上面没有错误的查询。我已取出公共列up,右列值将根据条件进行计算。

芮朗
2023-03-14

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

 类似资料:
  • 问题内容: 从此问题派生而来,是否可以对以下SQL语句使用HQL或Criteria: 尽管google提出了一些命中意见,表明HQL支持CASE语句,但是Hibernate 3.6.6失败并显示 QuerySyntaxException:意外令牌:CASE 当我在EntityManager实例上创建上述查询时。 为每个e.type创建另一个查询来手动确定男性人数(例如针对每个e.type)有多少个

  • 问题内容: 我有以下查询: 这返回 我将如何使它工作?说参数是否为“有效”,则返回具有以下条件的记录? 问题答案: 您可以使用另一种方法:

  • 问题内容: 我有一张桌子,我需要按以下方式显示输出。 rsp_ind = 0(表示“新”)和1(表示“ Accepted”(已接受))的行数 输出应为 我尝试使用以下查询。 和即时通讯输出为 有人可以帮助我调整查询以实现输出。注意:我不能为此加上一笔款项。它是更大程序的一部分,因此我无法为此添加超级查询。 问题答案: 您可以在此处查看此请求的输出

  • 如果我为第一个扫描器语句键入字母,我会得到“错误!!”和“输入一个数字”,但不能输入另一个数字。我是一个初学者,不知道输入语句是否可以在catch语句中使用

  • 问题内容: 有什么办法可以在HQL中执行以下操作: 问题答案: 我想你可以(3.6,4.3) [联编辑] …对于那些子句: “简单”情况和“搜索”情况,

  • 问题内容: 我想检查布尔值是否为真,然后在WHERE子句中确定要使用的条件。 假设布尔变量是@checkbool: 有否否定条件的方法?像在C ++中一样,您可以执行!(condition)。 如果不是,解决此问题的最佳方法是什么? 谢谢! 问题答案: SQL在C中的等效项是。但是,在您的情况下,您还需要其他东西:您需要建立一个条件,该条件根据的值在两个选择之间做出决定,如下所示: