在SQL数据库中排列移动号码
所有的手机号码已经进入格式447XXXXXXXX,我想这些号码格式为07XXXXXXXXXX。
我正在尝试以下查询:
UPDATE stack SET Telephone= REPLACE(Telephone,'447','07')
然而,如果一个数字包含447这个也将被replace,我想用通配符来replace每一列的前两个4。 更新所有49,000个条目的最好方法是什么,我已经创build了一个备份以防万一。
UPDATE
看起来数字被设置为错误的格式,所以下面的查询被用来把它们放在正确的格式中:
ALTER TABLE stack ALTER COLUMN Telephone VARCHAR(15)
现在所有的数字都显示在一个奇怪的格式:4.47944e + 011
将数据types更改为varchar
(数字数据types不存储前导零)。 要做到这一点,您需要先将其更改为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演示
也许改变来源(并在将来避免转换要求?):
=IF(LEFT(A1,2)="44",0&MID(A1,3,15),LEFT(A1,15))
这会导致一个string。
以下应该工作。 我也给了一个例子…你只需要使用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
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函数replaceExcel中的函数。