删除前两位数字并更改电话号码格式SQL

删除前两位数字并更改电话号码格式SQL,sql,sql-server,ssms,Sql,Sql Server,Ssms,我有一个表格,其中PhoneNumber列的值类似于911234567891。 我想删除开头的前两位数字,即123456781,然后我想将其更改为电话号码格式xxx xxx xxxx,以便最终结果为123-456-7891。 我已经使用seprate Select和Update查询完成了如下操作: SELECT [Phone Numbers] ,FORMAT([Phone Numbers],'###-###-####') AS [Formatted Phone] FRO

我有一个表格,其中PhoneNumber列的值类似于911234567891。 我想删除开头的前两位数字,即123456781,然后我想将其更改为电话号码格式xxx xxx xxxx,以便最终结果为123-456-7891。 我已经使用seprate Select和Update查询完成了如下操作:

SELECT
     [Phone Numbers]
    ,FORMAT([Phone Numbers],'###-###-####') AS [Formatted Phone]
    FROM tbl_sample


UPDATE tbl_sample
SET    [Phone Numbers] = SUBSTRING([Phone Numbers], 3, 8000) 
WHERE [Phone Numbers] LIKE '91%'
是否可以只使用单选查询,这样就不需要首先更新数据?
任何形式的帮助或建议都将不胜感激

这就是你要找的吗

UPDATE tbl_sample
    SET [Phone Numbers] = FORMAT(SUBSTRING([Phone Numbers], 3, 8000), '###-###-####') 
    WHERE [Phone Numbers] LIKE '91%';
或者,或者

select (case when [Phone Numbers] LIKE '91%'
             then FORMAT(CASt(SUBSTRING([Phone Numbers], 3, 8000) as bigint), '###-###-####') 
             else [Phone Numbers]
        end)
from tbl_sample;
或者,在SQL Server中,可以添加计算列:

alter table tbl_sample
    add Formatted_Phone_Number as (
        case when [Phone Numbers] LIKE '91%'
             then FORMAT(CASt(SUBSTRING([Phone Numbers], 3, 8000) as bigint), '###-###-####') 
             else [Phone Numbers]
        end));
如果列的长度始终是固定的,则可以使用子字符串执行此操作

UPDATE tbl_sample
SET [Phone Numbers] = SUBSTRING([Phone Numbers], 3, 3) + '-'+
                      SUBSTRING([Phone Numbers], 6, 3) + '-'+
                      SUBSTRING([Phone Numbers], 9, 4)
WHERE [Phone Numbers] LIKE '91%'
如果列[电话号码]是数字类别数据类型,则使用格式

UPDATE tbl_sample
SET [Phone Numbers] = FORMAT([Phone Numbers]-910000000000,'###-###-####')
WHERE [Phone Numbers] LIKE '91%'
如果您只需要选择

编辑:使用格式化的电话号码更新其他表格

UPDATE tb
SET tb.[Phone Numbers] = FORMAT(ta.[Phone Numbers]-910000000000,'###-###-####')
FROM tableA ta
JOIN tableB tb on ta.id = tb.id --change the join condition appropriately
WHERE tb.[Phone Numbers] LIKE '91%'

看起来格式化的第一个参数不能是@vkp的varchar。你当然是对的。我修正了答案。您可能需要检查值的长度,而不是91%。当长度只有10个字符,区号是913时会发生什么?如果这永远不会用于另一个地区,那么就可以了。虽然实际更改表中的数据使得未来可能添加亚洲、欧洲、南美等国家的电话号码非常具有挑战性。您已经非常接近我真正想要做的事情了。实际上,我想根据格式化为“-”后返回的电话号码从tableA更新TableB。是的,这就是我需要的。谢谢
UPDATE tb
SET tb.[Phone Numbers] = FORMAT(ta.[Phone Numbers]-910000000000,'###-###-####')
FROM tableA ta
JOIN tableB tb on ta.id = tb.id --change the join condition appropriately
WHERE tb.[Phone Numbers] LIKE '91%'