为何SQL WHERE子句的CASE表达式中不能使用布尔表达式?
问题解答
为什么你的CASE写法会报错?
SQL里的CASE是标量表达式,它要求每个THEN/ELSE分支必须返回一个具体的、确定类型的单个值(比如整数、字符串),而不是像FundKey = @fundKey这种条件判断语句。你写的分支里直接放了一个条件谓词,SQL解析器无法将其识别为合法的返回值,所以会抛出语法错误。
实现需求的简洁写法
方式1:用逻辑运算符直接组合(推荐)
这种写法最直观,数据库也更容易做查询优化:
DECLARE @fundKey INT = -1; SELECT FundKey, FundName FROM dbo.Funds WHERE (@fundKey > 0 AND FundKey = @fundKey) OR (@fundKey <= 0 AND FundKey < 1000000);
方式2:正确使用CASE表达式
如果一定要用CASE,需要让它返回一个可判断的标量值(比如用1/0代表真/假),再在WHERE里判断这个值:
DECLARE @fundKey INT = -1; SELECT FundKey, FundName FROM dbo.Funds WHERE CASE WHEN @fundKey > 0 THEN IIF(FundKey = @fundKey, 1, 0) ELSE IIF(FundKey < 1000000, 1, 0) END = 1;
(注:IIF是SQL Server的简化函数,等价于嵌套CASE,其他数据库可以换成CASE WHEN ... THEN 1 ELSE 0 END)
内容的提问来源于stack exchange,提问作者Peter Olson
相关产品推荐
相关产品推荐

