带大小写检查的SQL Server Where子句null

时间:2019-01-29 14:17:41

标签: sql sql-server

因此基本上可以对名字和姓氏进行名字搜索。名字搜索参数不是必需的,因此我在where子句中需要一个case语句。但是,我正在搜索的表中的字段名也可以为null。

问题是在SQL Server中检查您必须使用null还是不为null的null,并且我似乎无法将其与大小写一起使用。正则表达式%不包含空值。

在一个查询中可能吗?还是需要两个单独的查询?

本质上是这样的:

select *
from table
where first_name like case
                       when @pFirstName is not null then @pFirstName
                       when @pFirstName is null then '%' end
and last_name = @pLastName

6 个答案:

答案 0 :(得分:4)

您可以使用布尔逻辑:

WHERE ( (@pFirstName IS NOT NULL AND first_name = @pFirstName) OR
        (@pFirstName IS NULL)
      ) AND (last_name = @pLastName);

但是,您也可以评估的第一个逻辑:

(@pFirstName IS NULL OR first_name = @pFirstName)

使用该查询,您的查询将为SARGable

答案 1 :(得分:3)

您可以使用ISNULL()来处理是否传递一个参数。

我实际上不建议在查询中使用它,但是您可以执行以下操作:

select *
from table
where first_name = ISNULL(@pFirstName, first_name)
    and last_name = @pLastName;

但是,更好的版本是:

select         /* do you really need all (*) the columns? */
    column_1
    , column_2
    , column_3 
from table
where first_name = ISNULL(@pFirstName, first_name)
    and last_name = @pLastName
OPTION (RECOMPILE);

我要添加OPTION (RECOMPILE),以便在没有提供@pFirstName参数的情况下,通过重新计算行估计值来使查询的性能最佳(尽可能以这种形式)。

理想情况下,您将使用带有IF的参数进行处理:

IF @pFirstName IS NOT NULL
    BEGIN
        select
            column_1
            , column_2
            , column_3 
        from table
        where first_name = @pFirstName
            and last_name = @pLastName;
    END
ELSE
    BEGIN
        select
            column_1
            , column_2
            , column_3 
        from table
        where last_name = @pLastName;
     END

答案 2 :(得分:3)

尝试一下:

select *
from table
where (@pFirstName is null or first_name = @pFirstName)
  and last_name = @pLastName;

如果@pFirstName为空,则(@pFirstName is null or first_name = @pFirstName)的计算结果为true。如果@pFirstName不为null,则只要first_name = @pFirstName为true,整个表达式就为true。

答案 3 :(得分:3)

类似的事情可以做到

select *
from   table
where  (first_name is null or first_name = @pFirstName)
and    last_name = @pLastName

如果您需要like,它将看起来像这样

select *
from   table
where  (first_name is null or first_name like '%' + @pFirstName + '%')
and    last_name like '%' + @pLastName + '%'

答案 4 :(得分:1)

我认为您需要这个:

select * from table where last_name = @pLastName and 
    (@pFirstName is null or first_name = @pFirstName)

答案 5 :(得分:1)

...WHERE  (first_name like @pFirstName OR @pFirstName IS NULL) 
            AND last_name = @pLastName