在字符串SQL Server中将每个字母字符替换为自身+通配符

时间:2016-11-02 17:40:46

标签: sql sql-server wildcard

我的目标是创建一个查询,搜索与特定关键字相关的结果。

在数据库中说我们有单词cat。

无论用户是否输入C a t,C.A.T。或猫我想找到与搜索相关的结果,只要字母数字字符的顺序正确无关紧要

在数据库中说我们有这4条记录

cat
c/a/t
c.a.t
c. at

如果用户输入C#$*(&A T,我想获得所有4个结果。

到目前为止,我在查询中写的是一个从输入字符串中删除任何非字母数字字符的函数。

如何用自己替换每个字母数字字符并在结尾添加通配符?

对于每个字母字符,我的输入看起来与此类似

C%[^a-zA-Z0-9]%A%[^a-zA-Z0-9]%T%[^a-zA-Z0-9]%

2 个答案:

答案 0 :(得分:1)

实际上,该搜索字符串将只返回此表中的一条记录:'c.a.t '行。

这是因为表达式C%[^a-zA-Z0-9]%A并不意味着CA之间不存在任何字母数字字符。
它的实际含义是CA之间至少应有一个非字母数字值。

此外,它也会返回不正确的值 - 将返回'c u a s e t '之类的值。

您需要将where子句更改为以下内容:

WHERE column LIKE '%C%A%T%'
AND column NOT LIKE '%C%[a-zA-Z0-9]%A%[a-zA-Z0-9]%T%'

这样,如果您按正确顺序排列cat,则第一行将解析为true,如果c之间没有其他字母数字字符,{{ 1}}和a第二行将解析为t

这是一个测试脚本,你可以自己看看我的意思:

true

您还可以在this link中看到它。

由于我有空闲时间,这里有一个脚本可以从输入字符串中创建DECLARE @T AS TABLE ( a varchar(20) ) INSERT INTO @T VALUES ('cat'), ('c/a/t'), ('c.a.t '), ('c. at'), ('c u a s e t ') -- Incorrect where clause SELECT * FROM @T WHERE a LIKE 'C%[^a-zA-Z0-9]%A%[^a-zA-Z0-9]%T%[^a-zA-Z0-9]%' -- correct where clause SELECT * FROM @T WHERE a LIKE '%C%A%T%' AND a NOT LIKE '%C%[a-zA-Z0-9]%A%[a-zA-Z0-9]%T%' like模式:

not like

答案 1 :(得分:0)

您可以递归地浏览您的(已清理的)搜索字符串,并为每个字母添加您想要的表达式。在我的例子中,如果我理解正确的话,@ buildItring应该是你想要进一步使用的。

declare @cleanSearch as nvarchar(10) = 'CAT'
declare @builtString as nvarchar(100) = ''

WHILE LEN(@cleanSearch) > 0 -- loop until you deplete the search string
    BEGIN
        SET @builtString = @builtString + substring(@cleanSearch,1,1) + '%[^a-zA-Z0-9]%'  -- append the letter plus regular expression
            SET @cleanSearch = right(@cleanSearch, len(@cleanSearch) - 1)               -- remove first letter of the search string
    END

SELECT @builtString --will look like C%[^a-zA-Z0-9]%A%[^a-zA-Z0-9]%T%[^a-zA-Z0-9]%
SELECT @cleanSearch --@cleanSearch is now empty