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

Posted

技术标签:

【中文标题】如何在 SQL Server 中进行包含字符串每个单词的搜索查询?【英文标题】:How to make a search query where contain each words of string in SQL Server? 【发布时间】:2017-09-21 22:20:15 【问题描述】:

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

【问题讨论】:

【参考方案1】:

您可以创建函数将字符串拆分为单词的临时表。然后在查询中使用。

要创建函数,您可以点击链接T-SQL split string

DECLARE @string varchar(20) 
SELECT @string = 'test complete name'
SELECT complete_name from users 
   where complete_name in (dbo.splitstring(@string))

注意两件事

1) 参考链接使用逗号分隔,需要空格

2) 在查询中将进行精确搜索。您将需要为类似查询编写更多逻辑。例如在创建的函数中传递您的列值“complete_name”。在函数内部使用like比较并返回1或0。那么,哪里会变成

DECLARE @string varchar(20) SELECT @string = 'test complete name' SELECT complete_name from users where 1 = dbo.test_complete_name(@string,complete_name)

【讨论】:

【参考方案2】:

以下是一种方法,它不需要任何硬编码或创建任何附加功能。为了更容易理解,我尝试用不同的步骤来描述它。

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

【讨论】:

【参考方案3】:

创建一个像下面这样的函数来拆分给定的字符串并从给定的输入中返回单个单词

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**

【讨论】:

以上是关于如何在 SQL Server 中进行包含字符串每个单词的搜索查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Hive SQL 中列出每个类别中的前 10 行

如何比较同一张表(SQL Server)中的 2 行?

SQL Server:如何对两列/条件进行重复数据删除?

在 SQL Server 中,如何选择前 4 行?

SQL Server:根据多个条件从组中选择特定行

通过将数据存储在会话存储中进行会话管理