【问题标题】:SQL query - regex pattern for all alphabetsSQL 查询 - 所有字母的正则表达式模式
【发布时间】:2012-01-19 17:53:12
【问题描述】:

我正在使用 Microsoft SQL Server 2008。

我想检查从 A 到 Z 的所有字母,特殊字符,例如:“:”和“-”,以检查表中一列中的值。

我可以计算出“:”和“-”。如何计算 A 到 Z 之间的值?

我尝试了类似的方法,但它没有为我执行替换选项。

INSERT INTO Employee (Name, PhoneNo, Sal) VALUES ('Joe Wang', '666 2323', 222222222);

INSERT INTO Employee (Name, PhoneNo, Sal) VALUES ('John Doe','666 2323', '2G23:22-2' );

UPDATE dbo.Employee

SET Sal = REPLACE(REPLACE(Sal,'-',''), ':', '') 

WHERE Sal LIKE '%:%' OR Sal LIKE '%-%' OR Sal LIKE '%[A-Z]%';

我得到的“Sal”值为:222222222 和 2G23222

字母不会被替换。

我在网上检查了正则表达式模式,并得到了从 A 到 Z 的所有字母的 [A-Z]。我的 sql 是不是在某个地方出错了? 如果我替换为 [0-9] 也不起作用。

请帮忙。 谢谢。

【问题讨论】:

    标签: sql database sql-server-2008


    【解决方案1】:

    它失败了,因为您的 REPLACE 语句没有尝试替换字母,并且您不能在 REPLACE 中使用模式匹配。

    您应该尝试不同的方法,而是尝试查找与有效字符(数字?)不匹配的任何字符,然后替换该字符。

    Here's a blog post that contains a UDF that does just this:

    CREATE FUNCTION dbo.UFNG_ONLY_DIGITS (@StrVal AS VARCHAR(max))
    RETURNS VARCHAR(max)
    AS
    BEGIN
          WHILE PATINDEX('%[^0-9]%', @StrVal) > 0
                SET @StrVal = REPLACE(@StrVal,
                    SUBSTRING(@StrVal,PATINDEX('%[^0-9]%', @StrVal),1),'')
          RETURN @StrVal
    END
    

    然后您可以将更新语句编写为:

    UPDATE dbo.Employee
    SET Sal = dbo.UFNG_ONLY_DIGITS (Sal)
    WHERE PATINDEX('%[^0-9]%', Sal) > 0
    

    这不是一种非常有效的方法,但如果这只是一次清理,我认为这不是问题。

    【讨论】:

      【解决方案2】:

      在查询中使用 REGEXP[:alpha] 类似

      UPDATE dbo.Employee SET Sal = REPLACE(REPLACE(Sal,'-',''), ':', '')     
                   WHERE Sal LIKE '%:%' OR Sal LIKE '%-%' OR Sal REGEXP '[:alpha]';
      

      DOCUMENTATION ,希望对你有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多