如何在SQL的WHERE子句中编写条件语句?CASE语法报错如何解决
错误原因
你出现语法错误的核心原因是对SQL中CASE表达式的语法规则理解有误:
- SQL的
CASE属于标量值表达式,仅能返回数值、字符串这类可比较的具体值,不能直接返回逻辑判断语句。你在THEN和ELSE后编写的f.name LIKE @a_value、f.name = @a_value都是逻辑判断表达式,不符合CASE的语法要求,这是触发「LIKE附近存在语法错误」的直接原因。 - 你在
CASE外层写了f.name = CASE ...,相当于试图将字符串类型的f.name字段和CASE输出的逻辑值做等值比较,类型完全不匹配,逻辑也无法成立。
实现方案
方案1:逻辑运算符直接组合条件(更推荐)
无需使用CASE,直接用OR拼接两种分支的判断逻辑即可,这种写法优化器更容易匹配索引,执行效率更高:
DECLARE @a_value VARCHAR(5) = 'abcde' SELECT f.name , f.amount , f.date FROM fakeTable AS f WHERE ( (@a_value LIKE 'abc%' AND f.name LIKE @a_value) OR (@a_value NOT LIKE 'abc%' AND f.name = @a_value) ) AND f.date > '2000-01-01'
方案2:使用CASE实现(符合你原本的写法思路)
如果一定要用CASE实现,可以调整CASE的返回值为1/0代表是否满足条件,再和固定值做比较:
DECLARE @a_value VARCHAR(5) = 'abcde' SELECT f.name , f.amount , f.date FROM fakeTable AS f WHERE CASE WHEN @a_value LIKE 'abc%' THEN CASE WHEN f.name LIKE @a_value THEN 1 ELSE 0 END ELSE CASE WHEN f.name = @a_value THEN 1 ELSE 0 END END = 1 AND f.date > '2000-01-01'
内容的提问来源于stack exchange,提问作者haydnD
相关产品推荐
相关产品推荐

