【问题标题】:Add space before and after all numbers in an alphanumeric string in SQL在 SQL 中的字母数字字符串中的所有数字前后添加空格
【发布时间】:2017-01-09 06:32:50
【问题描述】:

在 SQL 中的字母数字字符串中的所有数字前后添加空格

例子:

aa01bb03cc -> aa 01 bb 03 cc

aa nk 0221ed23xyz op09 yy -> aa nk 0221 ed 23 xyz op 09 yy

【问题讨论】:

  • 因此,在您的字符串中,数字是如何出现的,在您的示例中,它们都是 2 位数字 - 连续系列。我的问题是还有其他组合吗?
  • @Abhishek:数字的任意组合和长度都是可能的。我已经更新了示例。
  • @AnonymouS 添加了更好的代码版本。应该更轻:)

标签: sql sql-server string alphanumeric string-operations


【解决方案1】:

我想出了这种方法:

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

它确实找到与这些模式之一不匹配的最小位置并在其后添加一个空格:

  • %[^ 0-9][0-9]% - 数字之前的东西,除了数字或空格
  • %[0-9][^ 0-9]% - 数字后面的东西,除了数字或空格

然后在后面加一个空格,然后继续循环。
我正在检查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 Server 在字符串操作方面表现不佳。

更新

进行了一些代码更改。这看起来更优雅一点,并且完全相同

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

【讨论】:

    猜你喜欢
    • 2013-10-19
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    相关资源
    最近更新 更多