在LIKE子句T-SQL中匹配的无序单词

时间:2016-02-18 07:59:03

标签: sql-server tsql string-matching

因为我无法对此帖发表评论:MySql: unordered words matching in like clause

因为我的堆栈溢出信誉点很低,而且“回答”明确表示不要求澄清,帮助等等。我必须提出自己的问题。

情况:

我正在使用T-SQL,我使用View作为表创建了一个存储过程,在此表中是一个包含3个字段(姓氏+给定名称+ id)的数据作为searchColumn的列。 我的C#Application将searchString传递给我的存储过程,字符串总是以%开头,所有空格都被%替换。 结果应该是查找searchColumn包含searchString输入的所有行。 所以当搜索字符串是%mai%han%19% 它应该给我所有姓氏包含mai的人,givenname包含han,id包含19。 嗯,到目前为止这个工作正常。 问题是,当searchString包含%19%han%mai%时,它不再起作用,因为它不是正确的顺序。

问题: 所以问题是(就像我提出的链接) 在like子句中匹配的无序单词? 但是与链接不同,解决方案应该是T-SQL。

有人知道如何做到这一点吗?

提前谢谢你 塞布丽娜

1 个答案:

答案 0 :(得分:-1)

完全达到目标的另一种解决方案:

ALTER PROCEDURE [dbo].[DATABASE]
    @searchfield NVARCHAR(1000)
AS
BEGIN 
declare @sql varchar(2000)
declare @search varchar(500), @count int, @part varchar(500), @rest varchar(500)

set @count = 0

set @search = @searchfield  

set @part = (substring(@search,0,@count))

set @rest = (substring(@search,@count+1,len(@search)))

set @sql = 'select * from [dbo].[DATABASE]'

set @count = charindex('%', @search)

set @part = (substring(@search,0,@count))

set @rest = (substring(@search,@count+1,len(@search)))

set @sql = @sql + ' where searchString like ''%'+ @part +'%'''

if(@count > 1 AND @count != 1)
BEGIN 
    WHILE (@count != 0)
    BEGIN       
        set @count = CHARINDEX('%', @rest)
        set @part = (SUBSTRING(@rest, 0, @count))       
        set @rest = (SUBSTRING(@rest, @count+1, len(@rest)))
        set @sql = @sql + ' AND searchString like ''%' + @part + '%'''
    END
END
SET NOCOUNT ON;
EXEC (@sql)
END

希望也可以帮助别人:) 我的一位同事帮助了我,谢谢他。