如何将数字列格式化为SQL中的电话号码

时间:2009-09-15 11:02:47

标签: sql sql-server sql-server-2005 tsql

我在数据库中有一个带有电话号码列的表。数字看起来像这样:

123456789

我想将其格式化为:

123-456-789

10 个答案:

答案 0 :(得分:35)

这应该这样做:

UPDATE TheTable
SET PhoneNumber = SUBSTRING(PhoneNumber, 1, 3) + '-' + 
                  SUBSTRING(PhoneNumber, 4, 3) + '-' + 
                  SUBSTRING(PhoneNumber, 7, 4)

根据Kane的建议,您可以在运行时计算电话号码的格式。一种可能的方法是为此目的使用标量函数(在SQL Server中工作):

CREATE FUNCTION FormatPhoneNumber(@phoneNumber VARCHAR(10))
RETURNS VARCHAR(12)
BEGIN
    RETURN SUBSTRING(@phoneNumber, 1, 3) + '-' + 
           SUBSTRING(@phoneNumber, 4, 3) + '-' + 
           SUBSTRING(@phoneNumber, 7, 4)
END

答案 1 :(得分:15)

我通常建议您将格式保留为前端代码,然后按原样从SQL返回数据。但是,要在SQL中执行此操作,我建议您创建一个用户定义的函数来格式化它。像这样:

CREATE FUNCTION [dbo].[fnFormatPhoneNumber](@PhoneNo VARCHAR(20))
RETURNS VARCHAR(25)
AS
BEGIN
DECLARE @Formatted VARCHAR(25)

IF (LEN(@PhoneNo) <> 10)
    SET @Formatted = @PhoneNo
ELSE
    SET @Formatted = LEFT(@PhoneNo, 3) + '-' + SUBSTRING(@PhoneNo, 4, 3) + '-' + SUBSTRING(@PhoneNo, 7, 4)

RETURN @Formatted
END
GO

然后你可以这样使用:

SELECT [dbo].[fnFormatPhoneNumber](PhoneNumber) AS PhoneNumber
FROM SomeTable

如果存储的电话号码不是预期的数字长,空白,空等,它有一个安全措施 - 它不会出错。

编辑:刚刚启动您想要更新现有数据。与我的答案相关的主要部分是你需要防止“狡猾”/不完整的数据(即如果某些现有值只有5个字符长的话)

答案 2 :(得分:10)

如上所述,这些解决方案非常基础,如果数据库具有不同的电话格式,它们将无法工作: (123)123-4564 123-456-4564 1234567989 等

这是一个更复杂的解决方案,可以使用任何输入:

    CREATE FUNCTION [dbo].[ufn_FormatPhone]
    (@PhoneNumber VARCHAR(32))
RETURNS VARCHAR(32)
AS
  BEGIN
    DECLARE  @Phone CHAR(32)

    SET @Phone = @PhoneNumber

    -- cleanse phone number string
    WHILE PATINDEX('%[^0-9]%',@PhoneNumber) > 0
      SET @PhoneNumber = REPLACE(@PhoneNumber,
               SUBSTRING(@PhoneNumber,PATINDEX('%[^0-9]%',@PhoneNumber),1),'')

    -- skip foreign phones
    IF (SUBSTRING(@PhoneNumber,1,1) = '1'
         OR SUBSTRING(@PhoneNumber,1,1) = '+'
         OR SUBSTRING(@PhoneNumber,1,1) = '0')
       AND LEN(@PhoneNumber) > 11
      RETURN @Phone

    -- build US standard phone number
    SET @Phone = @PhoneNumber

    SET @PhoneNumber = '(' + SUBSTRING(@PhoneNumber,1,3) + ') ' +
             SUBSTRING(@PhoneNumber,4,3) + '-' + SUBSTRING(@PhoneNumber,7,4)

    IF LEN(@Phone) - 10 > 1
      SET @PhoneNumber = @PhoneNumber + ' X' + SUBSTRING(@Phone,11,LEN(@Phone) - 10)

    RETURN @PhoneNumber
  END

答案 3 :(得分:9)

我不建议在数据库中保留错误数据,然后仅在输出中进行更正。我们有一个数据库,其中输入的电话号码如下:

  • (555)555-5555
  • 555 + 555 + 5555
  • 555.555.5555
  • (555)555-5555
  • 5555555555

组织中的不同人员可能会编写各种检索功能并对数据库进行更新,因此设置格式化和检索规则会更加困难。因此,我首先纠正数据库中的数据,然后设置规则并形成验证,以保护此数据库的完整性。

我认为没有理由保留不良数据,除非建议添加重复列并更正格式化原始数据以保留冗余和参考,并且我将格式错误的数据视为BAD数据。

答案 4 :(得分:5)

使用SUBSTRING和连接+的解决方案几乎独立于RDBMS。这是一个特定于SQL Server的简短解决方案:

declare @x int = 123456789
select stuff(stuff(@x, 4, 0, '-'), 8, 0, '-')

答案 5 :(得分:3)

你也可以试试这个:

CREATE  function [dbo].[fn_FormatPhone](@Phone varchar(30)) 
returns varchar(30)
As
Begin
declare @FormattedPhone varchar(30)

set     @Phone = replace(@Phone, '.', '-') --alot of entries use periods instead of dashes
set @FormattedPhone =
    Case
      When isNumeric(@Phone) = 1 Then
        case
          when len(@Phone) = 10 then '('+substring(@Phone, 1, 3)+')'+ ' ' +substring(@Phone, 4, 3)+ '-' +substring(@Phone, 7, 4)
          when len(@Phone) = 7  then substring(@Phone, 1, 3)+ '-' +substring(@Phone, 4, 4)
          else @Phone
        end
      When @phone like '[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9]' Then '('+substring(@Phone, 1, 3)+')'+ ' ' +substring(@Phone, 5, 3)+ '-' +substring(@Phone, 8, 4)
      When @phone like '[0-9][0-9][0-9] [0-9][0-9][0-9] [0-9][0-9][0-9][0-9]' Then '('+substring(@Phone, 1, 3)+')'+ ' ' +substring(@Phone, 5, 3)+ '-' +substring(@Phone, 9, 4)
      When @phone like '[0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]' Then '('+substring(@Phone, 1, 3)+')'+ ' ' +substring(@Phone, 5, 3)+ '-' +substring(@Phone, 9, 4)
      Else @Phone
    End
return  @FormattedPhone

使用它选择

(SELECT [dbo].[fn_FormatPhone](f.coffphone)) as 'Phone'

输出

enter image description here

答案 6 :(得分:1)

我发现如果想要(123) - 456-7890格式,这是有效的。

UPDATE table 
SET Phone_number =  '(' +  
                    SUBSTRING(Phone_number, 1, 3) 
                    + ') ' 
                    + '- ' +
                    SUBSTRING(Phone_number, 4, 3) 
                    + '-' +
                    SUBSTRING(Phone_number, 7, 4) 

答案 7 :(得分:1)

为我的目的更新了@ sqiller的功能

CREATE FUNCTION [toolbox].[FormatPhoneNumber] (
    @PhoneNumber VARCHAR(50),
    @DefaultIfUnknown VARCHAR(50)
)
RETURNS VARCHAR(50)
AS
BEGIN
    -- remove any extension
    IF CHARINDEX('x', @PhoneNumber, 1) > 0
        SET @PhoneNumber = SUBSTRING(@PhoneNumber, 1, CHARINDEX('x', @PhoneNumber, 1) - 1)

    -- cleanse phone number string
    WHILE PATINDEX('%[^0-9]%',@PhoneNumber) > 0
        SET @PhoneNumber = REPLACE(@PhoneNumber,
                SUBSTRING(@PhoneNumber,PATINDEX('%[^0-9]%',@PhoneNumber),1),'')

    -- Remove US international code if exists, i.e. 12345678900
    IF SUBSTRING(@PhoneNumber,1,1) = '1' AND LEN(@PhoneNumber) = 11
        SET @PhoneNumber = SUBSTRING(@PhoneNumber, 2, 10)

    -- any phone numbers without 10 characters are set to default
    IF LEN(@PhoneNumber) <> 10
        RETURN @DefaultIfUnknown

    -- build US standard phone number
    SET @PhoneNumber = '(' + SUBSTRING(@PhoneNumber,1,3) + ') ' +
                SUBSTRING(@PhoneNumber,4,3) + '-' + SUBSTRING(@PhoneNumber,7,4)

    RETURN @PhoneNumber
END

答案 8 :(得分:0)

如果您只想格式化输出,则无需创建新表或函数。在这种情况下,区号是在单独的字段上。我使用field1field2来说明您可以在同一查询中选择其他字段:

area  phone
213   8962102

选择声明:

Select field1, field2,areacode,phone,SUBSTR(tablename.areacode,1,3) + '-' + SUBSTR(tablename.phone,1,3) + '-' + SUBSTR(tablename.areacode,4,4) as Formatted Phone from tablename

示例输出:

columns: FIELD1, FIELD2, AREA, PHONE, FORMATTED PHONE
data:    Field1, Field2, 213,  8962102,  213-896-2102

答案 9 :(得分:0)

如果列是数字语法,则可以使用 FORMAT 格式(值,格式[,文化])在使用中像 FORMAT ( @d, 'D', 'en-US' )FORMAT(123456789,'###-##-####')(但这仅适用于 SQL SERVER 2012及之后

使用中 UPDATE TABLE_NAME SET COLUMN_NAME = FORMAT(COLUMN_NAME ,'###-##-####')

并且

如果您的列是Varchar或Nvarchar使用,请执行此操作 CONCAT(SUBSTRING(CELLPHONE,0,4),' ',SUBSTRING(CELLPHONE,4,3),' ',SUBSTRING(CELLPHONE,7,2) ,' ',SUBSTRING(CELLPHONE,9,2) )

您始终可以从

获得帮助
  

https://msdn.microsoft.com/en-us/library/hh213505.aspx