SQL'%'通配符是否捕获空值?

时间:2018-09-20 13:11:09

标签: sql sql-server

最近,我遇到了一个查询问题,该查询未返回预期返回的所有内容。按条件选择的查询部分如下:

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不能那样工作,但这基本上就是我希望完成的工作。

谢谢,很抱歉,如果重复的话,我找不到答案。

3 个答案:

答案 0 :(得分:7)

根据您要完成的工作,您的查询似乎可以对此进行优化:

AND (@val = 1 OR field = 'N')

LIKE似乎没有原因。

更新

由于您要尝试了解LIKECASE的行为,而不是使用现有查询,因此这里是可接受答案的一些变体。

要在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)

尝试一下(假设fieldvarcharnvarchar)-

AND ISNULL(field,'') LIKE 
    CASE WHEN @val = 1 THEN
        '%'
    ELSE
        'N'
    END