2009-09-15 10 views
19

データベースに電話番号カラムを持つテーブルがあります。私はこのように見えることをフォーマットしたい数値カラムをSQLの電話番号としてフォーマットする方法

123456789 

123-456-789 
+0

から助けるあなたがSQLやクライアントの表示コード(ASP、リサイズ、XMLなど)でそれらをフォーマットしますか? – Kane

+0

をSQLに変換する - 言い換えれば、新しいフォーマット – avnic

答えて

32

これはそれを行う必要があります。

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

Incorporatedのケインの提案を、あなたが計算できる数値は次のようになり実行時の電話番号の書式設定1つの可能なアプローチは、(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 
+3

に更新する元の値を保持し、新しい書式設定が必要な場合は、計算済みの列を追加することもできます(@ Davidの答えと同様のものを使用します)。 – Kane

+0

@Kane:私はこの考えを借りてポストを編集しました。 –

+2

これは 'RETURNS varchar(12)'で、最後の 'SUBSTRING'は' SUBSTRING(@phoneNumber、7、4) 'にする必要があります。 –

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 

それは、ケースに保存されている電話番号が長い桁数の期待値ではありません、中に安全装置を持っている空白になって、このような何か、nullなど - エラーは発生しません。

編集:ちょうどあなたの既存のデータを更新したいと思っています。私の答えと関連する主なビットは、 "dodgy" /不完全なデータから保護する必要があるということです(つまり、既存の値の長さが5文字しかない場合)

+0

悪いデータについての良い点! – HLGEM

+1

コードサンプルを更新して、長さが<> 10文字であるかどうかを最初に確認することを検討してください。これは、この文脈で最小の有効な数字になるからです。接頭辞は11文字です。同じことがelse文にも当てはまります。グループを3桁+ 3桁+4桁で受けたい – IEnumerator

8

データベースに不正なデータを保存することはお勧めしません。それを出力上で修正するだけです。

  • (555)555-5555
  • 555 + 555 + 5555
  • 555.555.5555
  • (555)555-5555
  • :私たちは、電話番号は次のように様々に入力されたデータベースを持っています組織内

異なる人々は、データベースに様々な検索機能及び更新を書き込むことができ、したがって、場所のフォーマット及びRに設定すること困難であろうetrievalルール。したがって、私はまずデータベースのデータを訂正し、その後、このデータベースの完全性を保護するためのルールとフォーム検証を設定します。

訂正された書式で重複した列を追加し、冗長性と参照のために元のデータを残しておかなければ、悪いデータを保持するという正当な理由はありません。

+0

電話番号の例をひどく書式化したものかどうかは分かりません。 –

+0

場合によっては、特に大規模な組織では、データソースがコントロール/リーチの外にあり、出力でのみ修正できます。 – IKnowledge

8

以上のユーザーが述べたように、これらのソリューションは非常に基本的であり、データベースのような別の電話の形式がある場合、彼らは動作しません。ここで (123)123-4564 123-456-4564 など

を与えられた任意の入力で動作します、より複雑なソリューションです:

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 
1

私は(123)に欠けている場合、これが機能することを発見 - 456-7890形式。 SUBSTRINGと連結+を使用

UPDATE table 
SET Phone_number = '(' + 
        SUBSTRING(Phone_number, 1, 3) 
        + ') ' 
        + '- ' + 
        SUBSTRING(Phone_number, 4, 3) 
        + '-' + 
        SUBSTRING(Phone_number, 7, 4) 
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 
5

ソリューションRDBMSとはほぼ無関係です。ここではSQL Serverに固有のものであり、短いソリューションは、次のとおりです。

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

ます。また、この試すことができます。その上で

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' 

出力]を選択しますbe

enter image description here

0

出力をフォーマットする場合は、新しいテーブルや関数を作成する必要はありません。このシナリオでは、市外局番は別のフィールドにあります。私はちょうどあなたが同じクエリ内の他のフィールドを選択することができます説明するためにfield1field2を使用します。

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 
0

あなたは形式を使用することができますカラムが数字の場合 のような構文FORMAT(value、format [、culture])使用中などの使用などに 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

関連する問題