【问题标题】:sql query to fix phone number problem in tablesql查询修复表中的电话号码问题
【发布时间】:2011-10-21 02:55:53
【问题描述】:

我有一个包含电话号码列的表。如何输入电话号码没有任何限制。目前电话号码格式如下

123-456-7890
(123)-456-7890
1234567890

我想更新表格并提供 123-456-7890 格式的所有电话号码。我有超过 2 万条记录。我可以使用 SQL Query 来做到这一点,还是必须在 ASP 或 PHP 中使用正则表达式?

编辑:注意最佳答案是针对修改后的问题,电话号码为 (123)-456-78790 更改为 (123)456-7890

【问题讨论】:

    标签: asp.net sql regex sql-server-2005


    【解决方案1】:

    如果它们严格采用这 3 种格式中的一种,您可以通过使用SUBSTRING 并测试每个项目的LEN 在 SQL 中轻松完成。

    如果有其他格式,我建议使用更擅长文本处理的语言,例如 .net。

    编辑添加:

    鉴于您认为目前只有这 3 种格式,您可以这样做:

    declare @t table (x varchar(20))
    insert into @t 
    select '123-456-7890'
    union select '(123)456-7890'
    union select '1234567890'
    
    select 
        case 
          when len(x) = 10 then 
            substring(x, 1, 3) + '-' + substring(x, 4, 3) + '-' + substring(x, 7, 4)
          when len(x) = 13 then
            substring(x, 2, 3) + '-' + substring(x, 6, 8)
          else x
        end
    from @t
    

    【讨论】:

    • 效果很好,但我将 (123)-456-7890 更改为 (123)456-7890。如何修改代码以处理它
    • 只是为了将来引用此内容的任何人,您在修改查询时忽略了将示例“(123)-456-7890”更改为“(123)456-7890”。
    【解决方案2】:

    我会加载每个电话号码并删除它们。

    所以删除所有句点、逗号、连字符 - 基本上所有不是数字的东西。

    然后以您要查找的格式重新插入它们。

    您可以通过查询或服务器端语言来做到这一点。

    【讨论】:

      【解决方案3】:

      Here is a great example: 展示如何在 TSQL 中为电话号码创建用户定义函数、自定义格式化函数

      【讨论】:

      • 不合格或解释性的链接不是很有帮助。
      • 该链接几乎是不合格的,我添加了 cmets 来解释你会发现什么:)
      【解决方案4】:

      这将起作用:

      首先替换括号和连字符,然后将它们重新添加进去。

      DECLARE @Number varchar(25)
      SELECT @Number = '(123)-456-7890'
      
      SELECT SUBSTRING(REPLACE(REPLACE(REPLACE(@Number, '(', ''), ')', ''), '-', ''), 1, 3) 
          + '-' 
          + SUBSTRING(REPLACE(REPLACE(REPLACE(@Number, '(', ''), ')', ''), '-', ''), 4, 3)  
          + '-' 
          + SUBSTRING(REPLACE(REPLACE(REPLACE(@Number, '(', ''), ')', ''), '-', ''), 7, 4)  
      

      注意 您可以创建一个标量函数来替换所有连字符和括号......这样会更具可读性:

      DECLARE @Number varchar(25)
      SELECT @Number = '(123)-456-7890'
      
      SELECT SUBSTRING(StripCharacters(@Number), 1, 3) 
          + '-' 
          + SUBSTRING(StripCharacters(@Number), 4, 3)  
          + '-' 
          + SUBSTRING(StripCharacters(@Number), 7, 4) 
      

      【讨论】:

        【解决方案5】:

        如果您只有 20K 条记录,那么就选择对您来说更容易的方法。就个人而言,我会提取所有数据,然后使用服务器端语言重新插入。 PHP、ASP 或 SQL 是否是一次性的并不重要。不过,请务必对新插入设置一些格式限制。

        【讨论】:

          【解决方案6】:

          看这个简单的例子:

          CREATE TABLE #temp
          (
            phonenumber VARCHAR(15)
          )
          
          INSERT INTO #temp 
                  ( phonenumber )
          VALUES  ( '555-578-5899'
          
           INSERT INTO    #temp
                      ( phonenumber )
           VALUES  ( '(555)-896-3269'  )
          
          INSERT INTO #temp
                  ( phonenumber )
          VALUES  ( '123-456-2129')
          
          
          update #temp
          set phonenumber=replace(phonenumber,'(','')
          update #temp
          set phonenumber=replace(phonenumber,')','')
          update #temp
          set phonenumber=replace(phonenumber,'-','')
          
           -- That will eliminate all (,- and ) from the table
          
          update #temp
          set phonenumber=left(phonenumber,3)+'-'+substring(phonenumber,4,3)
          +'-'+right(phonenumber,4) 
          
           SELECT * FROM #temp
          
           DROP TABLE #temp
          

          【讨论】:

            【解决方案7】:

            简洁且没有临时表:

            UPDATE Phones 
             SET phone = 
            SUBSTRING(REPLACE(REPLACE(REPLACE(phone,'-',''),')',''),'(',''),1,3) + '-'
            + SUBSTRING(REPLACE(REPLACE(REPLACE(phone,'-',''),')',''),'(',''),4,3) + '-'
            + SUBSTRING(REPLACE(REPLACE(REPLACE(phone,'-',''),')',''),'(',''),7,4)
            

            【讨论】:

            • 又快又脏……又丑:P
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-07-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多