Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将SQL Server字符串中的每个字母字符替换为自身+通配符_Sql_Sql Server_Wildcard - Fatal编程技术网

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

将SQL Server字符串中的每个字母字符替换为自身+通配符,sql,sql-server,wildcard,Sql,Sql Server,Wildcard,我的目标是创建一个查询,搜索与特定关键字相关的结果 比如说在数据库里我们有一个单词cat 无论用户键入的是C.a.t、C.a.t.还是Cat,只要字母数字字符的顺序正确,我都希望找到与搜索相关的结果,这才是最重要的 假设数据库中有这4条记录 cat c/a/t c.a.t c. at 如果用户输入C$*&A T,我希望获得所有4个结果 到目前为止,我在查询中编写的是一个从输入字符串中删除任何非字母数字字符的函数 如何将每个字母数字字符替换为其本身并在末尾添加通配符 对于每个alpha字符,我的

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

比如说在数据库里我们有一个单词cat

无论用户键入的是C.a.t、C.a.t.还是Cat,只要字母数字字符的顺序正确,我都希望找到与搜索相关的结果,这才是最重要的

假设数据库中有这4条记录

cat
c/a/t
c.a.t
c. at
如果用户输入C$*&A T,我希望获得所有4个结果

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

如何将每个字母数字字符替换为其本身并在末尾添加通配符

对于每个alpha字符,我的输入都与此相似

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

您可以递归地遍历已清理的搜索字符串,并在每个字母中添加所需的表达式。在我的示例中,@builtString应该是您希望进一步使用的,如果我理解正确的话

将@cleanSearch声明为nvarchar10='CAT' 将@builtString声明为nvarchar100= 虽然LEN@cleanSearch>0-循环,直到耗尽搜索字符串 开始 设置@builtString=@builtString+substring@cleanSearch,1,1+'%[^a-zA-Z0-9]'-附加字母和正则表达式 设置@cleanSearch=right@cleanSearch, len@cleanSearch-1-删除搜索字符串的第一个字母 终止 选择@builtString-将看起来像C%[^a-zA-Z0-9]%a%[^a-zA-Z0-9]%T%[^a-zA-Z0-9]% 选择@CleaneArch-@CleaneArch现在为空
实际上,该搜索字符串将从该表中只返回一条记录:带有“c.a.t”的行

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

此外,它还将返回不正确的值—将返回类似“cuaset”的值

您需要将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、a和t之间没有其他字母数字字符,第二行将解析为true

这是一个测试脚本,您可以亲自了解我的意思:

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%'
你也可以在中看到它的作用

由于我有一些空闲时间,下面是一个脚本,用于从输入字符串创建相似模式和不相似模式:

DECLARE @INPUT varchar(100) = '@*# c %^&# a ^&*$&* t (*&(%!@#$'

DECLARE @Index int = 1,
        @CurrentChar char(1), 
        @Like varchar(100),
        @NotLike varchar(100) = '%'

WHILE @Index < LEN(@Input) 
BEGIN

    SET @CurrentChar = SUBSTRING(@INPUT, @Index, 1)

    IF PATINDEX('%[^a-zA-Z0-9]%', @CurrentChar) = 0
    BEGIN
        SET @NotLike = @NotLike + @CurrentChar + '%[a-zA-Z0-9]%'
    END
    SET @Index = @Index + 1
END

SELECT  @NotLike = LEFT(@NotLike, LEN(@NotLike) - 12),
        @Like = REPLACE(@NotLike, '%[a-zA-Z0-9]%', '%')


SELECT *
FROM @T
WHERE a LIKE @Like
AND a NOT LIKE @NotLike