gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:25:04 27 4
gpt4 key购买 nike

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com