如何检查字符串中的字符并在插入之前替换该字符
Posted
技术标签:
【中文标题】如何检查字符串中的字符并在插入之前替换该字符【英文标题】:How to check for a character in a string and replace that character before insert 【发布时间】:2014-08-01 19:43:50 【问题描述】:好的,这个问题涉及一个复杂的存储过程的一部分,它将新实体插入到几个表中。
我目前遇到困难的部分需要像这样工作:
-
插入具有原始名称的实体
检查新实体的名称是否包含表 A“字符”中列出的任何特殊字符
如果是,则将该字符替换为表 A 中的“替换字符”
编辑:我已经完成了部分工作,但仍未完成。我仍然在显示字符替换的每个组合时遇到问题。此外,在替换字符出现多次的情况下,例如“.”,替换需要彼此独立发生。
例如:#www.test&aol.com -> #wwwtest&aol.com、#www.test&aolcom
这是一个艰难的开始,我知道其中的一部分不会起作用,但我认为这是一个不错的起点:
declare @test varchar(50)
set @test = '#www.test&aol.com'
declare @len int, @ctr int
set @len = LEN(@test)
set @ctr = 1
declare @newName varchar(50)
declare @matchedChar table(match varchar(10),replaceChar varchar(10),processed int default(0))
declare @alternateEntities table(name varchar(50))
declare @repChar varchar(10)
declare @selectedChar varchar(1)
while @ctr<=@len
begin
--Insert matching characters and replacement characters into table variable,
--this is necessary for the # character, which has multiple replacement characters
insert into @matchedChar (match,replaceChar) select Character,ReplacementCharacter from tblTransliterations where Character = SUBSTRING(@test,@ctr,1)
--loop
while (select COUNT(*) from @matchedChar where processed = 0)>0
begin
--get the top character from table variable
set @selectedChar = (select top 1 match from @matchedChar where processed = 0)
--get replacement character
set @repChar = (select top 1 replaceChar from @matchedChar where processed = 0)
--replace character in name string
--set @newName = (select Replace(@test,@selectedChar,@repChar))
set @newName = (select STUFF(@test,CHARINDEX(@selectedChar,@test),1,@repChar))
--update table variable to move onto next character
update @matchedChar set processed = 1 where @repChar = replaceChar
--add name with replaced character to alternate entities table
insert into @alternateEntities (name) values (@newName)
end
set @ctr = @ctr+1
set @len = LEN(@test)
end
select * from @alternateEntities
【问题讨论】:
您能否就“在'#'字符的情况下,有多个'替换字符'(No,No.,Number)”提供一些说明?你的意思是“#”需要换成“1”、“12”、“123”,意思是一串字符而不是单个字符? 对不起,我的意思是作为一个文字示例。因此,在我发布的代码中,@test 变量中的“#”符号需要替换为“否”、“否”。和“数字” 我以为你想反其道而行之(将 No. OR No OR Number 切换为 #)。如果您尝试将 # 切换到所有其他三个选项,我不知道如果不为每个选项复制记录,您将如何做到这一点。我想在您的另一张表中,您可以将 # 切换为 No,然后将 No 切换为 No.,然后将 No. 切换为 Number。这将导致在最后一次通过时,所有带有 #、No 或 No. 的记录都被切换为 Number。但我仍然不明白为什么它需要做这三个。或许您可以提供更多背景信息? 这是否意味着,如果 '#' 已替换 ('@', '$', '^'),'#www.test&aol.com' 将是 '@$^www.test&aol。 com'。或者别的什么!!! 这将有助于理解您为什么要这样做。您是否正在寻找创建模糊搜索的可能性?如果是这样,最好不要插入所有不同的组合。如果这只是您的存储过程的一部分,那么您正在创建一个巨大的不可维护的怪物。没有更多细节很难说,但我会使用一个搜索功能来检查音译表,并搜索所有组合和替换,而不必将它们保存在表中。另外,如果您可以在 sqlfiddle 上放置一些表和测试数据,那将无济于事。 【参考方案1】:使用基于集合的方法,而不是循环。
创建一个临时表并填充类型为 NVARCHAR(100) 的“Words”列,调用临时表 Invalid_Words
在 Invalid_Words 上为每个标记创建一个列,并使 col type = bit
如果单词包含令牌,则通过一系列更新语句更新临时表位列您现在已经定义了与每个单词匹配的标记。
下一部分是替换。
【讨论】:
以上是关于如何检查字符串中的字符并在插入之前替换该字符的主要内容,如果未能解决你的问题,请参考以下文章
需要使用正则表达式找到2个字符串,并在它们之间插入多行文本并插入替换文本