带多个[0-9]的SQL REPLACE



我有一个字符串,我想替换一组数字
字符串包含数字分组(和几个字母(。'A12 456 1 65 7944’我想用"xxx"替换3个数字的组,用"zzzz"替换4个数字的组合

我以为REPLACE(@str, '%[0-9][0-9][0-9]%', 'xxx')这样的东西会起作用,但它不起作用。我甚至无法让'%[0-9]%'替换任何东西。

如果REPLACE不合适,如何替换数字组?

请尝试以下基于XML和XQuery的解决方案。

注意事项:

  1. 我们在CROSS APPLY子句中将输入字符串标记为XML
  2. XQuery的FLWOR表达式正在使用特定长度,然后用替换字符串替换
  3. 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 |
+----+-------------------+-------------------+

最新更新