Sql Server conditional包含Null参数的自由文本搜索处理

时间:2011-09-19 11:45:54

标签: sql sql-server full-text-search contains

我一直在努力争取这个问题。

简而言之,我的查询按fileno和/或searchfield搜索

DECLARE @pSearchFor AS NVARCHAR(100);

- 我在这里测试的是空值,''或单独的单词     SET @pSearchFor = null - '“marsa”和“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 '%'+@fileNo+'%'
 ELSE r.FileNo
END

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

如果@pSearchFor为null,我将无法返回任何内容,否则效果很好。

如果为null

,我需要返回所有实例

一种可能的解决方案可能是调用2个单独的sps或使用if / else但可能存在更好的方法。

我非常感谢你的帮助!

2 个答案:

答案 0 :(得分: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 ...如果你想要一个子集,你不关心你得到哪个子集吗?

答案 1 :(得分: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 '%'+@fileNo+'%'
 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