括号内的 SQL Server CASE 子句

Posted

技术标签:

【中文标题】括号内的 SQL Server CASE 子句【英文标题】:SQL Server CASE clause on where inside parenthesis 【发布时间】:2017-09-04 06:21:36 【问题描述】:

我的 SQL 代码中有这个问题:

我只会显示我的WHERE 子句,因为它有点长, 就是这样:

where 
 ((@account_status = 1027 AND a.AccountStatus = 1027  AND a.FolioNo = 
  @folio_no AND b.ReservationNo = @reservation_id)) OR
 ((@account_status = 1026 AND a.AccountStatus = 1026  AND a.FolioNo = 
 @folio_no AND b.ReservationNo = @reservation_id)) OR
 ((@account_status = 1025 AND a.AccountStatus = 1025 AND @trans_code = 1 AND 
 a.AccountStatementTransCode = 1 AND b.FolioNo = @folio_no AND 
 b.ReservationNo = @reservation_id)) OR
 ((@account_status = 1025 AND a.AccountStatus = 1025 AND @trans_code != 1 
 AND a.AccountStatementTransCode != 1 AND b.FolioNo = @folio_no AND 
 b.ReservationNo = @reservation_id)) OR
 ((a.FolioNo = @folio_no AND b.ReservationNo = @reservation_id AND 
 @trans_code = 2 AND a.AccountStatementTransCode = 2 AND 
 case
   when @sub_category = 14 then i.category_id is null
    else i.category_id = @sub_category 
 end )) OR
 ((a.FolioNo = @folio_no AND b.ReservationNo = @reservation_id AND 
 @trans_code = 3 AND a.AccountStatementTransCode = 3 AND i.category_id = 
 @sub_category)) OR
 ((a.FolioNo = @folio_no AND b.ReservationNo = @reservation_id AND 
 @trans_code = 4 AND a.AccountStatementTransCode = 4 AND i.category_id = 
 @sub_category)) OR
 ((a.FolioNo = @folio_no AND b.ReservationNo = @reservation_id AND 
 @trans_code = 5 AND a.AccountStatementTransCode = 5 AND i.category_id = 
 @sub_category)) OR
 ((a.FolioNo = @folio_no AND b.ReservationNo = @reservation_id AND 
 @trans_code = 6 AND a.AccountStatementTransCode = 6 AND i.category_id = 
 @sub_category))

我希望如果输入是@sub_category = 14,那么它将返回具有NULL 值的类别,否则它将返回@sub_category 值。 我该怎么做?

【问题讨论】:

在 WHERE 子句中使用 AND/OR 而不是 case 表达式通常会更好。 很多看起来可以简化的。在添加更多逻辑之前,我会正确地开始。 jaydipj 已经回答了这个问题,谢谢大家的回答 :) 非常感谢! 【参考方案1】:

用下面的替换CASE表达式逻辑

AND 
1 = CASE WHEN @sub_category = 14 AND i.category_id is null 
         THEN 1
         WHEN @sub_category <> 14 AND i.category_id = @sub_category 
         THEN 1
         ELSE 0
    END 

【讨论】:

它有效,先生!多谢!这是我第一次遇到关于 where 子句的案例,所以我真的需要足够长的时间才能摆脱它!顺便问一下,1 和 0 的先生有什么用? @GGw 很高兴为您提供帮助!!。对您的问题的回答是,当您的条件满足时,1 和 0 只是返回值,然后返回 1,否则返回 0。然后此返回值用于相等性检查。像 1 = (返回值 1 或 0) 并基于此结果数据被过滤。 哦!这就是为什么我真的很想用 1 和 0 来尝试这些东西,但我担心它会真正返回 1 和 0 哈哈【参考方案2】:

将您的 CASE 更改为:

case
    when @sub_category = 14 then null
    else i.category_id = @sub_category 
 end

【讨论】:

i.category_id = @sub_category 这行导致问题。【参考方案3】:

试试这个:简单的方法,如果你的category_id 永远不会持有-1,或者你可以使用永远不会出现在category_id 中的值,即0,-1

AND ISNULL(i.category_id, -1) = CASE WHEN @sub_category = 14 THEN 
                                    -1 
                                ELSE @sub_category END

【讨论】:

以上是关于括号内的 SQL Server CASE 子句的主要内容,如果未能解决你的问题,请参考以下文章

在 MySQL 中按查询分组,忽略括号内的值

Where 子句案例陈述; ORA-00907: 缺少括号

in在sql中是啥意思

捕获大括号内的内容

一文讲懂SQL子查询

where 子句中的 case 语句 - SQL Server