【问题标题】:Sorting out mobile numbers on SQL databaseSQL数据库中的手机号码排序
【发布时间】:2013-12-22 20:14:41
【问题描述】:

所有的手机号码都变成了447XXXXXXXX的格式,我希望号码是07XXXXXXXXXX的格式。

我打算尝试以下查询:

UPDATE stack
SET Telephone= REPLACE(Telephone,'447','07')

但是,如果一个数字包含 447,这也将被替换,我正在考虑使用通配符来替换每列的前两个 4。更新所有 49,000 个条目的最佳方法是什么,我创建了一个备份以防万一。

更新

似乎数字设置为错误格式,因此使用以下查询将它们设置为正确格式:

ALTER TABLE stack ALTER COLUMN Telephone VARCHAR(15)

现在所有数字都以奇怪的格式显示:4.47944e+011

【问题讨论】:

  • 你使用的是什么数据库引擎?
  • Excel 我使用的是 2010,我使用 excel 导入我的数据,它在某一时刻格式错误。我更正了单元格值并导入回 SQL Server,现在这是我的最后一个问题。

标签: sql excel sql-server-2012 excel-2010


【解决方案1】:

将您的数据类型更改为varchar(数字数据类型不存储前导零)。为此,您需要先将其更改为 bigint,以进行转换:

ALTER TABLE your_table ALTER COLUMN Telephone BIGINT;
ALTER TABLE your_table ALTER COLUMN Telephone VARCHAR(15);

之后你可以像这样改变你的数据

UPDATE your_table
SET Telephone = '07' + substring(Telephone, 4,99)
WHERE charindex('447', Telephone) = 1

SQLFiddle demo

【讨论】:

  • Msg 8116, Level 16, State 1, Line 1 参数数据类型 float 对于子字符串函数的参数 1 无效。我认为问题可能仍然与数字的格式有关?
  • 您使用float作为电话号码的数据类型?使用varcharbigint,但不要使用float
  • 它是预设的,并且在某处发生了更改,我是否可以一次将它们更改为 varchar 或 bigint。超过 49k 个值
  • 我更新了我的评论。不知道你有这么长的电话号码。我将varchar(10) 更改为varchar(15)
  • 您应该将 float 转换为 bigint,将 bigint 转换为 varchar。您的错误消息说您尝试将 varchar 转换为 bigint。像在 Fiddle 演示中那样做。它在那里工作
【解决方案2】:

也许改变来源(并避免将来的转换要求?):

=IF(LEFT(A1,2)="44",0&MID(A1,3,15),LEFT(A1,15))  

这会产生一个字符串。

【讨论】:

    【解决方案3】:

    以下应该可以工作。我也举了一个例子...你只需要使用UPDATE语句...

    DECLARE @Telephone TABLE(Telephone VARCHAR(100))
    
    INSERT INTO @Telephone 
    SELECT '44712345' UNION ALL
    SELECT '123447' UNION ALL
    SELECT '447123447' 
    
    SELECT *
    FROM @Telephone
    
    UPDATE @Telephone
    SET Telephone = STUFF(Telephone, 1, 3, '07')
    WHERE (charindex('447', Telephone) = 1)
    
    SELECT *
    FROM @Telephone
    

    【讨论】:

    • 虽然查询看起来不错,但它并没有改变我表中的任何内容,这让我相信它可能与单元格属性有关?
    • 并且该查询还将替换电话号码中间的447
    • @juergend 谢谢...我看到并更新了查询...查看更新的答案...我也给出了数据示例...
    【解决方案4】:

    1) 电话号码(通常)使用 VARCHAR 列存储。

    2) 假设 old Telephone 列是 FLOAT 列,如果 Telehone 列(现在是 VARCHAR(15) 列)具有类似 '4.47944e+011' 的值,那么您需要将这些值转换回到 FLOAT,然后您必须使用 STR 将 FLOAT 值转换为 VARCHAR。比如下面的脚本

    DECLARE @PhoneFromFloat VARCHAR(15) = '4.47944e+011'
    SELECT STR(CONVERT(FLOAT, @PhoneFromFloat), 15, 0)
    

    输出:447944000000

    要执行此更新,您可以使用以下脚本:

    BEGIN TRANSACTION;
    
    UPDATE  dbo.Stack
    SET     Telephone = STR(CONVERT(FLOAT, Telephone), 15, 0)
    OUTPUT  deleted.Telephone, inserted.Telephone -- This clause will show affected phone numbers
    WHERE   Telephone LIKE '%e%';
    
    ROLLBACK;
    -- COMMIT
    

    注意:如果您将电话号码直接导入VARCHAR 列而不是FLOAT 列,则可以避免这些问题。

    3) 那么你可以使用:

    BEGIN TRANSACTION;
    
    UPDATE  dbo.Stack
    SET Telephone = STUFF(Telephone, 1, 2, '0')
    WHERE   Telephone LIKE '447%';
    
    ROLLBACK;
    -- COMMIT
    

    注意:您当然可以使用 Excel 函数在 Excel 中进行此替换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-23
      • 1970-01-01
      • 2020-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-23
      • 1970-01-01
      相关资源
      最近更新 更多