【问题标题】:Replace all non numeric characters in MSSQL with an empty string用空字符串替换 MSSQL 中的所有非数字字符
【发布时间】:2011-11-23 08:15:55
【问题描述】:

我当前的 MSSQL 表有一个“电话”列,它是一个 varchar。不幸的是,已经在数据库中的电话号码不是标准格式的。例如,888-888-8888 或 888/888/8888 或 (888)8888888 或 8888888888。

我想获取所有与 88888888 等价的行,即它应该与 888-888-8888、(888)888888 等匹配。

我曾尝试使用 REPLACE(),但在某些行的条目中包含其他字母字符,如“e”、“ex”、“ext”等。所以我想替换所有非数字字符。

使用 MSSQL 查询获取“匹配”行的最佳方法是什么?

【问题讨论】:

    标签: php sql sql-server


    【解决方案1】:

    你可以试试这个功能(MS SQL Server):

    CREATE FUNCTION uf_RemoveNotNumbers (@str varchar(max))
    RETURNS varchar(max)
    AS
    BEGIN
        WHILE @str LIKE '%[^0-9]%' 
        SET @str=replace(@str, substring(@str, patindex('%[^0-9]%',@str),1),'');
        RETURN @str
    END
    
    GO
    

    DECLARE @str varchar(max);
    SET @str = 'q56--89+9*67qweresr';
    select dbo.uf_RemoveNotNumbers (@str)
    

    【讨论】:

      【解决方案2】:

      使用 MySQL 的简单版本:

      SELECT * FROM `phones` WHERE `phone` LIKE '%8%8%8%8%8%8%8%8%8%8%'
      

      使用 PHP:

      // Get all your table rows into $rows using SELECT ..
      foreach ($rows as $row) {
          $row['phone'] = preg_replace('/\D/', '', $row['phone'];
          // Save the row using UPDATE ..
      }
      

      正则表达式\D 匹配任何非数字字符。请参阅php.net/preg_replace 了解更多信息。

      如果您只想找到与“8888888888”匹配的行,那么您可以使用:

      if (preg_match('/\D*8\D*8\D*8\D*8\D*8\D*8\D*8\D*8\D*8\D*8\D*/', $row['phone'])) {
          ..
      }
      

      这可以简化/抽象为:

      $match = '8888888888';
      if (preg_match('/' . preg_replace('/(\d)/', '\D*$1', $match) . '\D*/', $row['phone'])) {
          ..
      }
      

      【讨论】:

      • 我可以做一些事情而不必“更新”我的数据库吗?
      • 那么你想做什么?将数据库行从“888-888-8888”更改为“8888888888”,还是只找到与“8888888888”匹配的行?我编辑了我的答案,为后者提供了解决方案。
      • 我在我的问题中写了“PHP”,这是错误的。我希望一切都使用 MSSQL 查询来完成。我现在已经纠正了这个问题。对不起。
      • 你还没有指定你想要做什么。我添加了一个 MySQL 解决方案来选择您要查找的内容。见stackoverflow.com/questions/287105/…
      【解决方案3】:

      为什么不写一个 php 脚本来为你做呢?

      例如。获取所有行 -> 替换 -> 更新

      【讨论】:

        【解决方案4】:

        这是可能在 MSSQL 上运行的查询。

        create FUNCTION dbo.Only_Numbers
        
        (
        
            @string VARCHAR(8000)
        )
        
        RETURNS VARCHAR(8000)
        AS
        
        BEGIN
        
        DECLARE @IncorrectCharLoc SMALLINT
        SET @IncorrectCharLoc = PATINDEX('%[^0-9]%', @string)
        WHILE @IncorrectCharLoc > 0
        BEGIN
            SET @string = STUFF(@string, @IncorrectCharLoc, 1, '')
            SET @IncorrectCharLoc = PATINDEX('%[^0-9]%', @string)
            END
            SET @string = @string
        Return  @string 
        END
        
        GO
        
        select dbo.Only_Numbers('888*88-88/2')
        

        【讨论】:

          【解决方案5】:

          你可以试试这个代码:

          $query="select * from tablename";
          
          $result=mysql_query($query);
          
          while($row=mysql_fetch_array($result))
          {
              $str = preg_replace('[\D]', '', $row['phone']);
          }
          

          【讨论】:

            猜你喜欢
            • 2010-12-01
            • 2010-12-20
            • 2012-10-10
            • 2010-09-20
            • 2012-09-04
            • 2018-11-25
            • 2018-07-09
            • 1970-01-01
            • 2015-06-06
            相关资源
            最近更新 更多