【问题标题】:Regular expressions not working on SQL Server 2008正则表达式在 SQL Server 2008 上不起作用
【发布时间】:2015-08-10 20:49:35
【问题描述】:

我正在尝试编写一些 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
);

这不会产生任何错误,但不会影响任何行。

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 没错。 SQL Server 不支持现成的正则表达式。那里没有消息。

标签: sql sql-server regex sql-server-2008


【解决方案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 之前(与您使用的正则表达式更加一致)。

【讨论】:

    【解决方案2】:

    试试下面的查询:

    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 失败范围

    【讨论】:

    • 请注意 SQL Server 2008 不支持try_convert()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    相关资源
    最近更新 更多