복붙노트

[SQL] SQL에서 전화 번호와 같은 숫자 열을 포맷하는 방법

SQL

SQL에서 전화 번호와 같은 숫자 열을 포맷하는 방법

나는 전화 번호 열이 데이터베이스에 테이블이 있습니다. 숫자는 다음과 같다 :

123456789

나는 다음과 같이 해당 서식을 지정할 :

123-456-789

해결법

  1. ==============================

    1.이것은을 수행해야합니다

    이것은을 수행해야합니다

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

    통합 케인의 제안, 당신은 런타임에 전화 번호의 서식을 계산할 수 있습니다. 한 가지 가능한 방법은이 목적 (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
    
  2. ==============================

    2.나는 일반적으로 당신이 프런트 엔드 코드까지 서식 및 SQL에서 그대로 단지 데이터를 반환 떠날 것을 권 해드립니다. 그러나 SQL에서 그것을 할, 당신이 그것을 포맷하는 사용자 정의 함수를 만들 것을 권 해드립니다. 이 같은:

    나는 일반적으로 당신이 프런트 엔드 코드까지 서식 및 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
    

    또한, 저장된 전화 번호가 숫자의 예상 번호가 길지 않은 경우에 안전 장치를 가지고 빈, 널 (null) 등 - 그것은 오류하지 않습니다.

    편집 : 그냥 당신이 당신의 기존 데이터를 업데이트 할에 클럭. 내 대답에서 관련이있는 주요 비트는 당신이 "사기"/ 불완전한 데이터에 대해 보호하기 위해 (즉, 어떤 기존의 일부 값은 5 자 경우) 필요하다

  3. ==============================

    3.언급 한 이상에서, 그 솔루션은 매우 기본적인 데이터베이스 같은 다른 전화 형식이있는 경우 그들은 작동하지 않습니다 :

    언급 한 이상에서, 그 솔루션은 매우 기본적인 데이터베이스 같은 다른 전화 형식이있는 경우 그들은 작동하지 않습니다 :

    (123)123-4564
    123-456-4564
    1234567989
    etc
    

    여기에 주어진 모든 입력 작업하는 더 복잡한 솔루션입니다 :

    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
    
  4. ==============================

    4.나는 출력을 수정하는 경우에만 다음 데이터베이스에 잘못된 데이터를 유지하고하지 않는 것이 좋습니다. 우리는 전화 번호가 여러 가지로 입력 데이터베이스가 :

    나는 출력을 수정하는 경우에만 다음 데이터베이스에 잘못된 데이터를 유지하고하지 않는 것이 좋습니다. 우리는 전화 번호가 여러 가지로 입력 데이터베이스가 :

    조직의 다른 사람들은 데이터베이스에 다양한 검색 기능과 업데이트를 쓸 수 있습니다, 따라서 그것은 서식 장소 및 검색 규칙 세트에 어렵게 될 것입니다. 그래서 저는 맨 먼저 데이터베이스에있는 데이터를 수정하고 장소 규칙 및 향후이 데이터베이스의 무결성을 보호 형태의 검증에 설정하고있다.

    나는 형식을 수정하고 원래의 데이터가 중복 참조 주위를 유지하여 중복 열을 추가 할 제안하지 않는 잘못된 데이터를 유지에 대한 정당성을 볼 수없고, YES 나는 나쁜 데이터로 형식이 잘못된 데이터를 고려한다.

  5. ==============================

    5.솔루션 사용 SUBSTRING과 연결 +는 RDBMS의 거의 독립적이라고. 여기에 SQL 서버에 고유 짧은 솔루션입니다 :

    솔루션 사용 SUBSTRING과 연결 +는 RDBMS의 거의 독립적이라고. 여기에 SQL 서버에 고유 짧은 솔루션입니다 :

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

    6.당신이 시도 할 수 있습니다 :

    당신이 시도 할 수 있습니다 :

    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'
    

    출력 될 것입니다

  7. ==============================

    7.456-7890 형식 - 나는 (123)에 원하는 경우이 작동하는 것을 발견했다.

    456-7890 형식 - 나는 (123)에 원하는 경우이 작동하는 것을 발견했다.

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

    8.내 목적을 위해 sqiller의 기능 @ 업데이트

    내 목적을 위해 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
    
  9. ==============================

    9.당신이 열이 같은 숫자 구문 인 경우 형식을 사용할 수 있습니다 추천 사용시 FORMAT (값 형식 [문화]) FORMAT (@d, 'D', 'EN-US') 또는 FORMAT (123456789, '### - ## - ####') (하지만 SQL 서버 2012 이후이 작품)

    당신이 열이 같은 숫자 구문 인 경우 형식을 사용할 수 있습니다 추천 사용시 FORMAT (값 형식 [문화]) FORMAT (@d, 'D', 'EN-US') 또는 FORMAT (123456789, '### - ## - ####') (하지만 SQL 서버 2012 이후이 작품)

    에서 사용처럼 UPDATE TABLE_NAME SET COLUMN_NAME = FORMAT (COLUMN_NAME, '### - ## - ####')

    당신의 열이 VARCHAR 또는 NVARCHAR 사용하는 경우 다음과 같이 수행 CONCAT (SUBSTRING (핸드폰, 0,4) ', SUBSTRING (핸드폰, 4,3)', SUBSTRING (핸드폰, 7,2) ', SUBSTRING (핸드폰, 9,2))

    당신은 항상 도움을 얻을 수 있습니다

  10. ==============================

    10.당신은 출력에 새로운 테이블이나 함수를 만들 필요를 포맷하지하십시오. 이 시나리오에서는 지역 번호는 별도의 필드에 있었다. 내가 필드 1을 사용 FIELD2은 같은 쿼리에 다른 필드를 선택할 수 있습니다 설명합니다 :

    당신은 출력에 새로운 테이블이나 함수를 만들 필요를 포맷하지하십시오. 이 시나리오에서는 지역 번호는 별도의 필드에 있었다. 내가 필드 1을 사용 FIELD2은 같은 쿼리에 다른 필드를 선택할 수 있습니다 설명합니다 :

    area  phone
    213   8962102
    

    Select 문 :

    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
    
  11. from https://stackoverflow.com/questions/1426487/how-to-format-a-numeric-column-as-phone-number-in-sql by cc-by-sa and MIT license