括号内的 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 子句的主要内容,如果未能解决你的问题,请参考以下文章