我有一个字符串,我想替换一组数字
字符串包含数字分组(和几个字母(。'A12 456 1 65 7944’我想用"xxx"替换3个数字的组,用"zzzz"替换4个数字的组合
我以为REPLACE(@str, '%[0-9][0-9][0-9]%', 'xxx')
这样的东西会起作用,但它不起作用。我甚至无法让'%[0-9]%'
替换任何东西。
如果REPLACE不合适,如何替换数字组?
请尝试以下基于XML和XQuery的解决方案。
注意事项:
- 我们在
CROSS APPLY
子句中将输入字符串标记为XML - XQuery的FLWOR表达式正在使用特定长度,然后用替换字符串替换
- XQuery
.value()
方法返回一个最终结果
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, tokens VARCHAR(MAX));
INSERT INTO @tbl (tokens) VALUES
('A12 456 1 65 7944');
-- DDL and sample data population, end
DECLARE @separator CHAR(1) = SPACE(1);
SELECT t.*
, c.query('
for $x in /root/r/text()
return if (xs:int($x) instance of xs:int and string-length($x)=3) then "xxx"
else if (xs:int($x) instance of xs:int and string-length($x)=4) then "zzzz"
else data($x)
').value('.', 'VARCHAR(MAX)') AS Result
FROM @tbl AS t
CROSS APPLY (SELECT TRY_CAST('<root><r><![CDATA[' +
REPLACE(tokens, @separator, ']]></r><r><![CDATA[') +
']]></r></root>' AS XML)) AS t1(c);
输出
+----+-------------------+-------------------+
| ID | tokens | Result |
+----+-------------------+-------------------+
| 1 | A12 456 1 65 7944 | A12 xxx 1 65 zzzz |
+----+-------------------+-------------------+