最近,我遇到了一个查询问题,该查询未返回预期返回的所有内容。按条件选择的查询部分如下:
AND field LIKE
CASE WHEN @val = 1 THEN
'%'
ELSE
'N'
END
现在,当@val为1时,我希望这段代码实际上什么也不做,因为在这种情况下,基本上可以接受任何值,包括空值。
我对此有误吗?如果是这样,有人解决方案吗?我在考虑
AND field LIKE
CASE WHEN @val = 1 THEN
'%' OR ISNULL(field)
ELSE
'N'
END
但是SQL不能那样工作,但这基本上就是我希望完成的工作。
谢谢,很抱歉,如果重复的话,我找不到答案。
答案 0 :(得分:7)
根据您要完成的工作,您的查询似乎可以对此进行优化:
AND (@val = 1 OR field = 'N')
LIKE
似乎没有原因。
更新
由于您要尝试了解LIKE
和CASE
的行为,而不是使用现有查询,因此这里是可接受答案的一些变体。
要在CASE
中使用LIKE
,还必须使用类似COALESCE
的方法来处理空值。
COALESCE(Field, '') LIKE (CASE WHEN @val = 1 THEN '%' ELSE 'N' END)
否则,您可以在LIKE
中使用CASE
(如接受的答案),但可能是个人喜好,这似乎更易于阅读:
1 = (CASE WHEN @val = 1 OR Field LIKE 'N' THEN 1 ELSE 0 END)
答案 1 :(得分:2)
field LIKE '%'
与null不匹配。 CASE表达式必须返回一种结果类型,我在大多数情况下都喜欢int。
AND 1 = CASE
WHEN @val = 1 THEN 1
WHEN field like 'N' THEN 1
ELSE 0
END
答案 2 :(得分:1)
尝试一下(假设field
是varchar
或nvarchar
)-
AND ISNULL(field,'') LIKE
CASE WHEN @val = 1 THEN
'%'
ELSE
'N'
END