Replace the alternate occurances of a substring(替换子字符串的备用匹配项)
本文介绍了替换子字符串的备用匹配项的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我的输入字符串如下:
A or B OR C or D OR E or F
A OR B OR C OR D OR E OR F
预期输出:'A or B' OR 'C or D' OR 'E or F'
outputString = '''' + REPLACE(@inputValue COLLATE Latin1_General_CS_AS, ' OR ' COLLATE Latin1_General_CS_AS, ''' OR ''') + ''''
我尝试使用SQL REPLACE函数,上面的语句对于第一个字符串工作正常,但对于第二个字符串我得到了所需的输出,因为我们所有的OR都是大写的,所以它失败并返回'A' OR 'B' OR 'C' OR 'D' OR 'E' OR 'F'
我使用的是SSMS 15.0。
如何解决此问题?如有任何帮助,我们将不胜感激。
推荐答案
以下是使用UDF的解决方案。
此函数将模式上的字符串拆分为结果集。
(类似于STRING_SPLIT函数,但带有模式)
然后使用FOR XML
技巧从拆分的部分构造字符串,并添加引号。
DECLARE @vchNewValue VARCHAR(100), @result VARCHAR(100); SET @vchNewValue = 'A OR B or C OR D or E OR F'; SET @result = LTRIM(RTRIM(( SELECT CASE WHEN match = 1 THEN ' '+quotename(ltrim(rtrim(replace(value,' OR ',' or ') )),'''')+' ' ELSE UPPER(value) END FROM dbo.fnPattern_Split(' '+@vchNewValue+' ', ' % OR % ') AS spl ORDER BY ordinal FOR XML PATH(''), TYPE).value(N'./text()[1]', N'nvarchar(max)') )); SELECT @result AS result;
结果 |
---|
‘A或B’或‘C或D’或‘E或F’ |
测试数据库<;>;小提琴here
自定义项
使用PATINDEX查找字符串中给定模式的每个下一个起始位置。
然后查找模式仍然有效的最近结束位置。
所以这有点像正则表达式中的懒惰搜索。
然后使用这些位置将部件插入到返回表中。
CREATE FUNCTION dbo.fnPattern_Split ( @str VARCHAR(MAX), @pattern VARCHAR(100) ) RETURNS @tbl TABLE ( ordinal INT, value VARCHAR(MAX), match BIT ) WITH SCHEMABINDING AS BEGIN DECLARE @value NVARCHAR(MAX) , @splitvalue NVARCHAR(MAX) , @startpos INT = 0 , @endpos INT = 0 , @ordinal INT = 0 , @foundend BIT = 0 , @patminlen INT = ISNULL(NULLIF(LEN(REPLACE(@pattern,'%','')),0),1); WHILE (LEN(@str) > 0) BEGIN SET @startpos = ISNULL(NULLIF(PATINDEX('%'+@pattern+'%', @str),0), LEN(@str)+1); IF @startpos < LEN(@str) BEGIN SET @foundend = 0; SET @endpos = @startpos+@patminlen-1; WHILE @endpos < LEN(@str) AND @foundend = 0 BEGIN IF SUBSTRING(@str, @startpos, 1+@endpos-@startpos) LIKE @pattern SET @foundend = 1; ELSE SET @endpos += 1; END END ELSE SET @endpos = LEN(@str); IF @startpos > 1 BEGIN SET @ordinal += 1; SET @value = LEFT(@str, @startpos-1); INSERT INTO @tbl (ordinal, value, match) VALUES (@ordinal, @value, 0); END IF @endpos >= @startpos BEGIN SET @ordinal += 1; SET @splitvalue = SUBSTRING(@str, @startpos, 1+@endpos-@startpos); INSERT INTO @tbl (ordinal, value, match) VALUES (@ordinal, @splitvalue, 1); END SET @str = SUBSTRING(@str, @endpos+1, LEN(@str)); END; RETURN; END;
这篇关于替换子字符串的备用匹配项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:替换子字符串的备用匹配项
基础教程推荐
猜你喜欢
- SQL Server:只有 GROUP BY 中的最后一个条目 2021-01-01
- 无法在 ubuntu 中启动 mysql 服务器 2021-01-01
- SQL Server 2016更改对象所有者 2022-01-01
- Sql Server 字符串到日期的转换 2021-01-01
- 将数据从 MS SQL 迁移到 PostgreSQL? 2022-01-01
- 在 VB.NET 中更新 SQL Server DateTime 列 2021-01-01
- ERROR 2006 (HY000): MySQL 服务器已经消失 2021-01-01
- SQL Server 中单行 MERGE/upsert 的语法 2021-01-01
- 如何在 SQL Server 的嵌套过程中处理事务? 2021-01-01
- 使用pyodbc“不安全"的Python多处理和数据库访问? 2022-01-01