在 SQL 中的字母数字字符串中的所有数字前后添加 space
Add space before and after all numbers in an alphanumeric string in SQL
在 SQL
中的字母数字字符串中的所有数字前后添加 space
示例:
aa01bb03cc -> aa 01 bb 03 cc
aa nk 0221ed23xyz op09 yy -> aa nk 0221 ed 23 xyz op 09 yy
我想到了这个方法:
CREATE FUNCTION dbo.WhitespaceNumbers (
@string VARCHAR(MAX)
)
RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE @position0 INT = 0
, @position1 INT = 0
, @position2 INT = 0;
WHILE @string LIKE '%[^ 0-9][0-9]%' OR @string LIKE '%[0-9][^ 0-9]%'
BEGIN
SET @position1 = PATINDEX('%[^ 0-9][0-9]%', @string);
SET @position2 = PATINDEX('%[0-9][^ 0-9]%', @string);
SET @position0 = (
SELECT MIN(position)
FROM (VALUES (@position1), (@position2)) AS T(position)
WHERE T.position > 0
);
SET @string = STUFF(@string, @position0 + 1, 0, ' ');
END
RETURN @string;
END
它确实找到了与这些模式之一不匹配的最小位置,并在其后添加了一个白色space:
%[^ 0-9][0-9]%
- 除了数字或白色之外的数字之前的东西space
%[0-9][^ 0-9]%
- 数字后的东西,除了数字或白色space
然后在后面加一个space,然后继续循环
我正在进行 T.position > 0
检查,因为如果只有一个匹配的模式,@position0 将设置为 0,它将 运行 无限。
结果符合您查询的预期:
PRINT dbo.WhitespaceNumbers('aa01bb03cc');
aa 01 bb 03 cc
PRINT dbo.WhitespaceNumbers('aa nk 0221ed23xyz op09 yy');
aa nk 0221 ed 23 xyz op 09 yy
请记住,这是非常原始的,可以简化并包装在函数中以封装逻辑。
我也鼓励您在应用程序级别应用以下逻辑,而不是数据库(如果可能)。 SQL 服务器在字符串操作方面表现不佳。
更新
进行了一些代码更改。这看起来更优雅一点并且完全相同
CREATE FUNCTION dbo.WhitespaceNumbers (@string VARCHAR(MAX))
RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE @position INT;
WHILE 1 = 1
BEGIN
SET @position = (
SELECT MIN(position)
FROM (VALUES (PATINDEX('%[^ 0-9][0-9]%', @string)), (PATINDEX('%[0-9][^ 0-9]%', @string))) AS T(position)
WHERE T.position > 0
);
IF @position IS NULL
BREAK;
SET @string = STUFF(@string, @position + 1, 0, ' ');
END
RETURN @string;
END
在 SQL
中的字母数字字符串中的所有数字前后添加 space示例:
aa01bb03cc -> aa 01 bb 03 cc
aa nk 0221ed23xyz op09 yy -> aa nk 0221 ed 23 xyz op 09 yy
我想到了这个方法:
CREATE FUNCTION dbo.WhitespaceNumbers (
@string VARCHAR(MAX)
)
RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE @position0 INT = 0
, @position1 INT = 0
, @position2 INT = 0;
WHILE @string LIKE '%[^ 0-9][0-9]%' OR @string LIKE '%[0-9][^ 0-9]%'
BEGIN
SET @position1 = PATINDEX('%[^ 0-9][0-9]%', @string);
SET @position2 = PATINDEX('%[0-9][^ 0-9]%', @string);
SET @position0 = (
SELECT MIN(position)
FROM (VALUES (@position1), (@position2)) AS T(position)
WHERE T.position > 0
);
SET @string = STUFF(@string, @position0 + 1, 0, ' ');
END
RETURN @string;
END
它确实找到了与这些模式之一不匹配的最小位置,并在其后添加了一个白色space:
%[^ 0-9][0-9]%
- 除了数字或白色之外的数字之前的东西space%[0-9][^ 0-9]%
- 数字后的东西,除了数字或白色space
然后在后面加一个space,然后继续循环
我正在进行 T.position > 0
检查,因为如果只有一个匹配的模式,@position0 将设置为 0,它将 运行 无限。
结果符合您查询的预期:
PRINT dbo.WhitespaceNumbers('aa01bb03cc');
aa 01 bb 03 cc
PRINT dbo.WhitespaceNumbers('aa nk 0221ed23xyz op09 yy');
aa nk 0221 ed 23 xyz op 09 yy
请记住,这是非常原始的,可以简化并包装在函数中以封装逻辑。
我也鼓励您在应用程序级别应用以下逻辑,而不是数据库(如果可能)。 SQL 服务器在字符串操作方面表现不佳。
更新
进行了一些代码更改。这看起来更优雅一点并且完全相同
CREATE FUNCTION dbo.WhitespaceNumbers (@string VARCHAR(MAX))
RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE @position INT;
WHILE 1 = 1
BEGIN
SET @position = (
SELECT MIN(position)
FROM (VALUES (PATINDEX('%[^ 0-9][0-9]%', @string)), (PATINDEX('%[0-9][^ 0-9]%', @string))) AS T(position)
WHERE T.position > 0
);
IF @position IS NULL
BREAK;
SET @string = STUFF(@string, @position + 1, 0, ' ');
END
RETURN @string;
END