2011-09-19 13 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 ...如果你想有一個子集,你不關心哪個子集,你呢?

相關問題