如何在SQL Server中创建包含字符串中每个单词的搜索查询?

时间:2017-04-25 04:26:11

标签: sql sql-server stored-procedures

我想进行搜索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%'

3 个答案:

答案 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+'%'