2011-09-19 14 views
1

我一直在努力了很长一段时间才能得到这个查询。通过的fileno和/或searchfieldSQL Server的条件包含自由文本搜索处理空参数

DECLARE @pSearchFor AS NVARCHAR(100); 

总之我的查询搜索 - 我在这里与空值的测试, '',或者单独的词 SET @pSearchFor = NULL - “ “马尔萨”和“mosta”;

IF ISNULL(@pSearchFor,'') = '' SET @pSearchFor = '""' ; 

declare @fileNo nvarchar(50) = 'e/e' 

select top 1000 r.FileId, r.FileNo, fs.SearchField, @pSearchFor 

from regfile as r 
left outer join FileSearchFields as fs on r.FileId = fs.FileID 
where r.FileNo like 
CASE 
WHEN Len(@fileno) > 1 THEN '%'[email protected]+'%' 
ELSE r.FileNo 
END 

AND 
    1 = 
    CASE WHEN ISNULL(@pSearchFor, '') = '' THEN 1 ELSE 0 END 
     or CONTAINS(fs.SearchField, @pSearchFor) 

我得到什么返回如果@pSearchFor为空,否则的伟大工程。

我需要返回所有实例,如果空

一个可能的解决办法可能是调用2个独立的SPS或使用if/else语句,但可能存在更好的方法。

我真的很感谢你的帮助!

回答

0

我已经解决了这个问题。也许这可能对别人有帮助! 这是我的存储过程的一个片段。

@fileNo nvarchar(50) = null , 
@fields nvarchar(100) = '""',`enter code here` 
@datefrom date = null, 
@dateto date = null, 
... 
AS`enter code here` 
BEGIN 

if (@fields = null or LEN(@fields) < 1) set @fields = '""' 

select top 1000 r.*, 
(CASE 
     WHEN fs.SearchField IS NULL THEN CONVERT(NVarChar(1),'') 
     ELSE CONVERT(NVarChar(MAX),fs.SearchField) 
    END) AS [Search] 
from regfile as r 
left outer join FileSearchFields as fs on r.FileId = fs.FileID 
where r.FileNo like 
CASE 
WHEN Len(@fileno) > 1 THEN '%'[email protected]+'%' 
ELSE r.FileNo 
END 
and 
    r.Date between 
CASE 
WHEN @datefrom != '' THEN @datefrom 
ELSE '1900-1-1' 
END 

and 
CASE 
WHEN @dateto != '' THEN @dateto 
ELSE '9999-1-1' 
END 
and 
((LEN(@fields) > 2 and contains(fs.SearchField,@fields))or (LEN(@fields) <= 2)) 
--NB: <= 2 as we have added the "" characters in @fields! 

end 
1

首先你设置@pSearchFor""

IF ISNULL(@pSearchFor,'') = '' SET @pSearchFor = '""' ; 

这意味着这将永远不会返回1:

CASE WHEN ISNULL(@pSearchFor, '') = '' THEN 1 ELSE 0 END 

您需要可以使用不同的变量,或使用相同类型CASE表达在select列表中,而不是将值从NULL更改为""

SELECT TOP 1000 r.FileId, r.FileNo, fs.SearchField, 
    CASE WHEN COALESCE(@pSearchFor, '') = '' THEN '""' ELSE @pSearchFor END 

而且你使用SELECT TOP但没有ORDER BY ...如果你想有一个子集,你不关心哪个子集,你呢?

相关问题