我想进行搜索sql查询以查找包含用户输入字符串的名称。它类似于下面的查询,但我不知道如何制作' where'部分。我一直在寻找谷歌,但我仍然找不到合适的。
DECLARE @string varchar(20)
SELECT @string = 'test complete name'
SELECT complete_name from users
where complete_name like '%test%'
or complete_name like '%complete%'
or complete_name like '%name%'
or complete_name like '%test complete%'
or complete_name like '%test name%'
or complete_name like '%complete name%'
or complete_name like '%test complete name%'
答案 0 :(得分:2)
创建一个如下所示的函数,它拆分给定的字符串并返回给定输入中的单个单词
Create function fn_stringSplit(@StringSplit varchar(max))
returns @table table(SplitValue varchar(10) not null)
as
begin
Declare @StartVal int
Declare @endVal int
set @StringSplit = @StringSplit + ' '
set @StartVal = 1
set @endVal = 1
while @endVal >= 0
begin
set @endVal = charindex(' ',@StringSplit,@StartVal);
insert into @table select SUBSTRING(@StringSplit,@StartVal,@endVal-1)
set @StringSplit= SUBSTRING(@StringSplit,@endVal+1, LEN(@StringSplit))
if @StringSplit = '' set @endVal= -1
end
return
end
现在通过输入
在主查询中调用我们的函数DECLARE @string varchar(20)
SELECT @string = 'Marketing tool designer'
SELECT JobTitle from Employee e
where JobTitle in (select e.JobTitle from fn_stringSplit(@string) ss
where e.JobTitle like '%'+SplitValue+'%') --Here Splitvalue is the column name in the table that is returned by fn_stringSplitfunction
在SQL SERVER 2016中我们有一个函数String_Split,我们可以将查询写为
DECLARE @string varchar(20)
SELECT @string = 'Marketing tool designer'
SELECT JobTitle from Employee e
where JobTitle in (select e.JobTitle from String_Split(@string) ss
where e.JobTitle like '%'+Value+'%') --Here **value** is the column name in the table that is returned by **String_Split**
答案 1 :(得分:0)
您可以创建函数将字符串拆分为单词的临时表。然后在查询中使用。
要创建功能,您可以点击链接T-SQL split string
Registry.dispatch(Registry.PoolPubSub, "PoolPubSub", fn entries ->
for {pid, _} <- entries, do: GenServer.call(pid, :notify_pool)
end)
照顾好两件事
1)参考链接使用逗号分隔符,您将需要空格
2)在查询中将进行精确搜索。您需要为类似查询编写更多逻辑。例如传递你的列值&#34; complete_name&#34;在创建的功能。在函数内部使用比较并返回1或0.那么,哪里将成为
DECLARE @string varchar(20)
SELECT @string = 'test complete name'
SELECT complete_name from users
where complete_name in (dbo.splitstring(@string))
答案 2 :(得分:0)
以下是一种方法,不需要任何硬编码或创建任何附加功能。我尝试用不同的步骤来描述它以便于理解。
DECLARE @string varchar(20) ,@stringxml xml,@rowvalue varchar(20)
SELECT @string = 'test complete name'
--Convert the string to an xml
Select @stringxml=CAST(('<a>'+replace(@string,' ','</a><a>')+'</a>' )as xml)
--Split the xml to rows based on each word.i.e. each word to one row using nodes()
select Row_values.value('.' ,'varchar(max)')
AS StringValues
FROM
@stringxml.nodes('/a') As StrXml(Row_values)
上面的查询返回一个包含每个单词的行的表。此表可以与您的表一起进行所需的搜索。
以下查询是您需要的最终答案
DECLARE @string varchar(20) ,@stringxml xml,@rowvalue varchar(20)
SELECT @string = 'test complete name'
--convert string to xml
Select @stringxml=CAST(('<a>'+replace(@string,' ','</a><a>')+'</a>' )as xml)
--Inner join your table to the value from nodes
Select DISTINCT Urtbl.[ColName] from [YourTableName] Urtbl inner join(
select Row_values.value('.' ,'varchar(max)')
AS StringValues
FROM
@stringxml.nodes('/a') As StrXml(Row_values)) newtbl
on Urtbl.[ColName] like '%'+newtbl.StringValues+'%'