如果为空,则返回SQL参数结果返回所有值

时间:2011-03-09 16:28:28

标签: sql sql-server-2005

我有这个代码,如果在我的参数中我使用'123'而没有用于第二个,那么我得到每一行返回,因为它匹配地址2中的wilcards与每一行,因为它的空白。现在我该如何阻止这种情况发生?

SELECT     AddressID, Address1, Address2
FROM         Address
WHERE     (Address1 LIKE '%' + @add1 + '%') OR
                      (Address2 LIKE '%' + @add2 + '%')

谢谢

4 个答案:

答案 0 :(得分:2)

您可以使用nullif。如果nullif的参数相等,则结果为null,like null不会给出任何命中。

SELECT AddressID, Address1, Address2
FROM Address
WHERE (Address1 LIKE '%' + nullif(@add1, '') + '%') OR
      (Address2 LIKE '%' + nullif(@add2, '') + '%')

答案 1 :(得分:1)

空字符串将导致结果返回,但不会返回null。

if ( @add2 = '' )
begin
    set @add2 = null
end

SELECT     AddressID, Address1, Address2
FROM         Address
WHERE     (Address1 LIKE '%' + @add1 + '%') OR
                      (Address2 LIKE '%' + @add2 + '%')

答案 2 :(得分:0)

您可以在REPLACE之上使用'%' + @add2 + '%'功能(可能用于@add1),将%%替换为''或其他任何可返回的功能什么都没有。

例如:

SELECT     AddressID, Address1, Address2
FROM         Address
WHERE     (Address1 LIKE REPLACE('%' + @add1 + '%','%%', 'VoidInput')) OR
                      (Address2 LIKE REPLACE('%' + @add2 + '%','%%', 'VoidInput'))

这将与'VoidInput'匹配一个空参数,但否则与原始%input%string匹配

答案 3 :(得分:0)

当@ add2为空时,它将与Address2中的所有内容匹配。

试试这个:

SELECT AddressID, Address1, Address2
FROM Address
WHERE ((@add1 <> '' and Address1 LIKE '%' + @add1 + '%') 
        OR (@add2 <> '' and Address2 LIKE '%' + @add2 + '%'))