我一直在努力争取这个问题。
简而言之,我的查询按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但可能存在更好的方法。
我非常感谢你的帮助!
答案 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