s-s-rS 多关键字搜索

Posted

技术标签:

【中文标题】s-s-rS 多关键字搜索【英文标题】:s-s-rS multiple keyword search 【发布时间】:2014-02-19 14:24:15 【问题描述】:

我正在使用 s-s-rS 2008。我有一份报告,我希望用户能够在搜索块中输入任意数量的关键字,以针对数据集进行检查,而不管数据集中的单词位置如何。例如,如果他们搜索 2005 Ford Escort,它应该返回字符串中包含所有三个单词的所有记录,不一定按照输入的顺序。

【问题讨论】:

【参考方案1】:

这可以使用动态 SQL 来完成。如果您有能力创建自己的函数,您可以创建一个函数,将您的参数输入拆分为输入的每个单词的不同行(注意:每个单词必须用空格分隔,函数才能正常工作)

Create FUNCTION [dbo].[SplitString] ( @stringToSplit VARCHAR(MAX) )
RETURNS
@returnList TABLE ([Name] [nvarchar] (500))
AS
BEGIN

DECLARE @name NVARCHAR(255)
DECLARE @pos INT

WHILE CHARINDEX(' ', @stringToSplit) > 0
 BEGIN
  SELECT @pos  = CHARINDEX(' ', @stringToSplit)  
  SELECT @name = SUBSTRING(@stringToSplit, 1, @pos-1)

  INSERT INTO @returnList 
  SELECT '%' + CAST(@name AS VARCHAR(255)) + '%'

  SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)
 END

 INSERT INTO @returnList
SELECT '%' + CAST(@stringToSplit AS VARCHAR(255)) + '%'

 RETURN
END

如果您输入“2005 Ford Escape”,这将返回 3 行,每个单词用空格分隔 1。现在,您可以使用动态 SQL 为函数返回的行数创建查询,结果就是您要报告的结果。

(我确信这个动态 SQL 可以重写得更简洁,但下面的解决方案将为您提供所需的答案/逻辑)

DECLARE @query VARCHAR(MAX)
DECLARE @query2 VARCHAR(MAX)

SET @query = ''
SET @query2 = ''

SELECT @query =
'
Select CarName from CarData
'
FROM dbo.SplitString('2005 Ford Escape')

SELECT @query2 = @query2 + 
'
and CarName like ''' + name + '''
'
FROM dbo.SplitString('2005 Ford Escape')

SET @query2 = STUFF(@query2,1,5,'where')

SET @query = @query + @query2

如果你执行,这会给你以下结果:

PRINT @query

从 CarData 中选择 CarName 其中 CarName like '%2005%' 和 CarName 之类的 '%Ford%' 和 CarName 之类的 '%Escape%'

最后一步是创建一个您将报告的表,并在表中执行@query 变量。

CREATE TABLE #temp
(
CarName VARCHAR(250)
)

INSERT INTO #temp
EXEC(@query)

SELECT * FROM #temp

DROP TABLE #temp

【讨论】:

我添加了顶部列出的功能。我创建了一个存储过程,但它给了我一个错误:和 VehicleInformation like ''' + name + '''。这是我用过的: PROCEDURE [dbo].[usp_VehicleSearch] @SearchString as VarChar(MAX) SET NOCOUNT ON; DECLARE @query VARCHAR(MAX) DECLARE @query2 VARCHAR(MAX) SET @query = '' SET @query2 = '' SELECT @query = ' Select * from dbo.vwVehicles ' FROM dbo.SplitString(@SearchString) SELECT @query2 = @query2 + ' and VehicleInformation like ''' + name + ''' ' FROM dbo.SplitString(@SearchString) SET @query2 = STUFF(@query2,1,5,'where') SET @query = @query + @query2 CREATE TABLE #temp ( CarName VARCHAR(250) ) INSERT INTO #temp EXEC(@query) SELECT * FROM #temp DROP TABLE #temp END 去掉脚本末尾的'END'。此外,您的 STUFF 函数应该替换 4 个字符,而不是 5 个。STUFF(@query2,1,4,'where')。一个检查你工作的好方法是 PRINT @query,就像我上面写的那样。通常阅读动态 SQL 可能是一个好主意,这样您就可以更轻松地自己尝试它。【参考方案2】:

尝试像这样创建一个简单的 SQL 查询

select * from Cars where CarBrand like '%' + @Name + '%'

这将显示与您的关键字名称匹配的所有数据。

【讨论】:

此回复适用于单个关键字或字符串,但不能将字符串分解为多个关键字。【参考方案3】:

这是一个非常简单的解决方案。您可以通过将搜索字符串中的空格替换为“联合选择”字符串来创建动态 SQL 字符串,这样搜索字符串中的每个单词都会在表变量中获得一条记录。然后将表变量加入到汽车表中:

-- load test data
declare @cars table(car varchar(50))
insert into @cars values
    ('Ford Escape 2005'),
    ('Ford 2005 Escape'),
    ('Escape 2005 Ford'),
    ('Escape Ford 2005'),
    ('2005 Ford Escape'),
    ('2005 Escape Ford'),
    ('Some 2005 Other Escape text Ford in here'),
    ('This is not the 2005 Ford you are looking for'),
    ('Neither is this Ford Escape with no Year')

-- get search string values into table
declare @search table(string varchar(50))
declare @sql nvarchar(max), @string nvarchar(50)
set @string = '2005 Ford Escape' -- this is your user parameter
set @sql = 'select ''' + replace(ltrim(rtrim(@string)),' ',''' union select ''') + ''''
insert into @search
exec(@sql)

-- return matching car records
select
    c.car
from @cars c
    inner join @search s
        on c.car like '%' + s.string + '%'
group by
    c.car
having count(*) = (select count(*) from @search) -- every search string record must match the car value

【讨论】:

以上是关于s-s-rS 多关键字搜索的主要内容,如果未能解决你的问题,请参考以下文章

基于vue的多引擎搜索及关键字提示

高亮显示 筛选 搜索元素 模糊匹配 多关键词搜索

iBoxDB全文搜索原理,演示与代码

06云计算中具有多关键字搜索的基于区块链的公钥加密

Linux如何在vi里搜索关键字

vue中搜索框根据关键字筛选