我有这个代码,如果在我的参数中我使用'123'而没有用于第二个,那么我得到每一行返回,因为它匹配地址2中的wilcards与每一行,因为它的空白。现在我该如何阻止这种情况发生?
SELECT AddressID, Address1, Address2
FROM Address
WHERE (Address1 LIKE '%' + @add1 + '%') OR
(Address2 LIKE '%' + @add2 + '%')
谢谢
答案 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 + '%'))