因此基本上可以对名字和姓氏进行名字搜索。名字搜索参数不是必需的,因此我在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
答案 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