在SQL数据库中排序移动号码

时间:2013-12-22 20:14:41

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

所有手机号码都采用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

4 个答案:

答案 0 :(得分:3)

将数据类型更改为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

答案 1 :(得分:1)

可能更改源(并避免将来转换要求?):

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

这会产生一个字符串。

答案 2 :(得分:0)

以下应该工作。我也举了一个例子......你只需要使用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

答案 3 :(得分:0)

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

2)假设 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中执行此替换。