sql-server - SQL Replace 函数中的正则表达式模式?

标签 sql-server regex

SELECT REPLACE('<strong>100</strong><b>.00 GB', '%^(^-?\d*\.{0,1}\d+$)%', '');

我想用上面的正则表达式替换数字两部分之间的任何标记,但它似乎不起作用。我不确定正则表达式语法是否错误,因为我尝试了更简单的语法,例如 '%[^0-9]%' 只是为了测试,但它也不起作用。有谁知道我怎样才能实现这个目标?

最佳答案

您可以使用PATINDEX 查找模式(字符串)出现的第一个索引。然后使用STUFF将另一个字符串填充到匹配的模式(字符串)中。

循环遍历每一行。将每个非法字符替换为您想要的字符。在您的情况下,将非数字替换为空白。内部循环是指如果循环的当前单元格中有多个非法字符。

DECLARE @counter int

SET @counter = 0

WHILE(@counter < (SELECT MAX(ID_COLUMN) FROM Table))
BEGIN  

    WHILE 1 = 1
    BEGIN
        DECLARE @RetVal varchar(50)

        SET @RetVal =  (SELECT Column = STUFF(Column, PATINDEX('%[^0-9.]%', Column),1, '')
        FROM Table
        WHERE ID_COLUMN = @counter)

        IF(@RetVal IS NOT NULL)       
          UPDATE Table SET
          Column = @RetVal
          WHERE ID_COLUMN = @counter
        ELSE
            break
    END

    SET @counter = @counter + 1
END

警告:但这很慢!拥有 varchar 列可能会产生影响。因此使用 LTRIM RTRIM 可能会有所帮助。不管怎样,它很慢。

信用归this StackOverFlow 答案。

编辑 功劳还归功于@srutzky

编辑(@Tmdean) 这个答案可以适应更基于集合的解决方案,而不是一次执行一行。它仍然迭代单行中非数字字符的最大数量,因此它并不理想,但我认为在大多数情况下应该可以接受。

WHILE 1 = 1 BEGIN
    WITH q AS
        (SELECT ID_Column, PATINDEX('%[^0-9.]%', Column) AS n
        FROM Table)
    UPDATE Table
    SET Column = STUFF(Column, q.n, 1, '')
    FROM q
    WHERE Table.ID_Column = q.ID_Column AND q.n != 0;

    IF @@ROWCOUNT = 0 BREAK;
END;

如果您在表中维护一个位列来指示该字段是否已被清理,您还可以大大提高效率。 (在我的示例中,NULL 代表“未知”,应该是列默认值。)

DECLARE @done bit = 0;
WHILE @done = 0 BEGIN
    WITH q AS
        (SELECT ID_Column, PATINDEX('%[^0-9.]%', Column) AS n
        FROM Table
        WHERE COALESCE(Scrubbed_Column, 0) = 0)
    UPDATE Table
    SET Column = STUFF(Column, q.n, 1, ''),
        Scrubbed_Column = 0
    FROM q
    WHERE Table.ID_Column = q.ID_Column AND q.n != 0;

    IF @@ROWCOUNT = 0 SET @done = 1;

    -- if Scrubbed_Column is still NULL, then the PATINDEX
    -- must have given 0
    UPDATE table
    SET Scrubbed_Column = CASE
        WHEN Scrubbed_Column IS NULL THEN 1
        ELSE NULLIF(Scrubbed_Column, 0)
    END;
END;

如果您不想更改架构,可以很容易地将中间结果存储在表值变量中,该变量最终应用于实际表。

关于sql-server - SQL Replace 函数中的正则表达式模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21378193/

相关文章:

javascript - 如何在 Angular 中正确添加额外验证指令?

iPhone 连接到 SQL 服务器

c# - 调用带输出的存储过程

regex - Powershell捕获多个值?

regex - Python 使用正则表达式替换短代码

regex - 如何在 Jenssegers raw() 函数中正确应用正则表达式

Python正则表达式解析为二维数组

c# - INSERT查询显示插入数据但实际上没有插入数据

sql - 获取分隔列中的最大日期(月和年)

sql - 从字符串转换日期和/或时间时转换失败