我正在尝试编写一些SQL代码(在SQL Server 2008上)以获取列并在单元格符合正则表达式模式时替换条目。基本上,如果列中的单元格具有C12345形式(字母C后跟五位数字),我想放弃C.否则,我想单独留下单元格。这是我尝试过的代码:
UPDATE table1
SET column1 = (
CASE WHEN column1 LIKE 'C[0-9]{5, 5}' THEN SUBSTRING(column1, 1, 5)
ELSE column1
END
);
这不会产生任何错误,但不会影响任何行。
非常感谢任何帮助。谢谢!
答案 0 :(得分:1)
我认为你可以表达你想要的东西:
UPDATE table1
SET column1 = (CASE WHEN column1 LIKE 'C[0-9][0-9][0-9][0-9][0-9]%'
THEN SUBSTRING(column1, 2, 5)
ELSE column1
END);
SQL Server不支持开箱即用的正则表达式。它确实有一个扩展的like
。我假设上面的内容是您想要的,尽管您可能希望在%
之前C
(与您使用的正则表达式更加一致)。
答案 1 :(得分:0)
尝试以下查询:
UPDATE table1
SET column1 = (
CASE WHEN column1 LIKE 'C%'
AND (ISNULL(TRY_CAST(SUBSTRING(column1,2,100) as INT),-1) BETWEEN 0 AND 99999)
THEN SUBSTRING(column1, 1, 5)
ELSE column1
END
);
<强>哈克:强>
这里的诀窍是首先检查C作为第一个字母然后检查是否为5位数字。我使用SUBSTRING(column1,2,100)
在C之后提取剩余的数字。请注意,100只是非常高的值,所以我从C column1
后获得了所有内容。
下一步是使用TRY_CAST转换为INT(如果是数字),否则为-1,其失败范围