我有一个带有随机文本的变量,比如
DECLARE @sNumberFormat NVARCHAR(200) = 'rand{text.here,{999}also-Random9He8re'
我想用[0-9]
替换{999}
中的每个9
。所以在这个例子中,我想得到
'rand{text.here,[0-9][0-9][0-9]also-Random9He8re'
问题是我永远不知道括号里会放多少9
,所以可以有{99}
{9999}
。。然后继续。我还需要验证是否有任何无效字符(不是9
(,那么不应该替换任何字符。
我尝试过REPLACE
和PATINDEX
函数的一些组合,但我无法实现。
如果没有强大的正则表达式支持,SQL Server的本机函数在这里没有太多帮助。有一种方法有点麻烦,就是将输入字符串分为三个部分:
rand{text.here,
{999}
also-Random9He8re
接下来,将中间目标子字符串中的9
替换为@
,或其他一些您不希望出现在输入字符串中其他任何位置的字符:
rand{text.here,
{@@@}
also-Random9He8re
最后,用[0-9]
替换中间子串中的@
,然后连接在一起得到最终结果:
DECLARE @val NVARCHAR(200) = 'rand{text.here,{999}also-Random9He8re'
SELECT REPLACE(
SUBSTRING(@val, 1, CHARINDEX('{9', @val) - 1) +
REPLACE(SUBSTRING(@val,
CHARINDEX('{9', @val) + 1,
CHARINDEX('9}', @val) - CHARINDEX('{9', @val)), '9', '@') +
SUBSTRING(@val, CHARINDEX('9}', @val) + 2, LEN(@val) - CHARINDEX('9}', @val)),
'@', '[0-9]');
所以我的懒惰开发人员建议这样做:
SELECT Replace(
Replace(
Replace(
Replace(@input, '{9999}', '[0-9][0-9][0-9][0-9]')
, '{999}', '[0-9][0-9][0-9]')
, '{99}', '[0-9][0-9]')
, '{9}', '[0-9]') AS result
;
只要你想进行一次性替换,你就可以继续延长。
快。易于理解的可扩展黑客。
有时懒惰就足够了。
这可以通过CTE系列来完成。它与任意数量的";9〃;方括号中的值。
Declare @str varchar(max) = 'rand{text.here,{999}also-Random9He8re';
With A As
(Select 1 As Pos
Union All
Select Pos+1 As Pos From A Where Pos < LEN(@str)
),
B As (
Select STRING_AGG(Case When Chr Like '[{9}]' Then Chr Else ' ' End, '') As Chr
From A Cross Apply (Select SUBSTRING(@str,A.Pos,1 )) As T(chr)
),
C As (
Select [value] As pattern,
REPLACE(REPLACE(REPLACE([value], '9', '[0-9]'),'{',''),'}','') As replacement,
ROW_NUMBER() Over (ORDER BY (SELECT NULL)) As Num,
COUNT(*) OVER (ORDER BY (SELECT NULL)) As Cnt
From B Cross Apply STRING_SPLIT(Chr,' ')
Where [value] Like '{%}' And [value] Like '%9%'
),
D As (
Select @str As Result, 1 As Num
Union All
select REPLACE(Result, C.pattern, C.replacement) As Res , D.Num+1 As Num
From D Inner Join C On (D.Num=C.Num)
Where D.Num<=C.Cnt)
Select Top 1 Result
From D
Order by Num Desc
- A-获取文本中的字符位置列表
- B-获取包含空格而非字符的文本"9","{","}">
- C-获取模式和相应的替换值
- D-使用REPLACEMENT函数获取结果