Sql Server 条件包含 Null 参数的自由文本搜索处理
为了让这个查询继续进行,我已经努力了很长一段时间。
简而言之,我的查询通过 fileno 和/或搜索字段进行搜索
DECLARE @pSearchFor AS NVARCHAR(100);
- 我在这里使用 null 值、 ' ' 或单独的单词进行测试 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 但可能存在更好的方法。
我真的很感谢你的帮助!
I have been struggling for quite some time to get this query going.
In short my query searches by fileno and/or searchfield
DECLARE @pSearchFor AS NVARCHAR(100);
-- I am here testing with null value, ' ' , or seperate words
SET @pSearchFor = null -- '"marsa" and "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)
I am getting nothing returned if @pSearchFor
is null otherwise works great.
I need to return all instances if a null
One possible solution might be to call 2 seperate sps or use if /else but probably exists a better method.
I really do appreciate your help!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
首先,将
@pSearchFor
设置为""
:这意味着这永远不会返回 1:
您需要使用不同的变量,或者使用相同类型的
CASE
表达式,而不是将值从select
列表中的NULL
更改为""
。此外,您还使用
SELECT TOP
但没有ORDER BY
...如果您想要一个子集,您不关心获得哪个子集吗?First you set
@pSearchFor
to""
:That means this will never return 1:
You need to either use a different variable, or use the same type of
CASE
expression in theselect
list, instead of changing the value fromNULL
to""
.Also you use
SELECT TOP
but noORDER BY
... if you want a subset, don't you care which subset you get?我已经解决了这个问题。也许这对其他人有帮助!
这是我的存储过程的一个片段。
I have solved the problem. Maybe this may be of some help to others!
This is a snippet of my stored procedure.