web-dev-qa-db-de.com

Formatieren einer numerischen Spalte als Telefonnummer in SQL

Ich habe eine Tabelle in der Datenbank mit einer Telefonnummernspalte. Die Zahlen sehen so aus:

123456789

Ich möchte das so formatieren, dass es so aussieht:

123-456-789
22
avnic

Das sollte es tun:

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

Mit dem Vorschlag von Kane können Sie die Formatierung der Telefonnummer zur Laufzeit berechnen. Ein möglicher Ansatz wäre die Verwendung von Skalarfunktionen für diesen Zweck (funktioniert in 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
35
David Andres

Generell würde ich Ihnen empfehlen, die Formatierung Ihrem Front-End-Code zu überlassen und die Daten so, wie sie sind, von SQL zurückzugeben. Um dies in SQL zu tun, würde ich jedoch empfehlen, eine benutzerdefinierte Funktion zum Formatieren zu erstellen. Etwas wie das:

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

Was können Sie dann so verwenden:

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

Es gibt eine Sicherheitsfunktion, falls die gespeicherte Telefonnummer nicht die erwartete Anzahl von Ziffern ist, leer ist, Null usw. - es wird kein Fehler angezeigt.

BEARBEITEN: Sie müssen gerade Ihre aktuellen Daten aktualisieren. Das wichtigste Bit, das aus meiner Antwort relevant ist, ist, dass Sie sich vor "zweifelhaften"/unvollständigen Daten schützen müssen (d. H., Was ist, wenn einige vorhandene Werte nur 5 Zeichen lang sind). 

15
AdaTheDev

Ich empfehle nicht, fehlerhafte Daten in der Datenbank zu belassen und sie nur in der Ausgabe zu korrigieren. Wir haben eine Datenbank, in der die Telefonnummern unterschiedlich eingegeben werden:

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

Verschiedene Personen in einer Organisation schreiben möglicherweise verschiedene Abruffunktionen und Aktualisierungen in die Datenbank. Daher ist es schwieriger, Formatierungs- und Abrufregeln festzulegen. Ich korrigiere daher vor allem die Daten in der Datenbank und setze dann Regeln und Formularvalidierungen ein, um die Integrität dieser Datenbank zukünftig zu schützen.

Ich sehe keine Rechtfertigung dafür, schlechte Daten beizubehalten, es sei denn, es wird vorgeschlagen, eine doppelte Spalte mit korrigierter Formatierung hinzuzufügen und die Originaldaten für Redundanz und Referenzzwecke beizubehalten.

9
Daniel Byrne

Wie bereits erwähnt, sind diese Lösungen sehr einfach und funktionieren nicht, wenn die Datenbank unterschiedliche Telefonformate hat: (123) 123-4564 123-456-4564 1234567989 Etc

Hier ist eine komplexere Lösung, die mit jeder Eingabe funktioniert:

    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
9
Hiram

Lösungen, die SUBSTRING und Verkettung + verwenden, sind nahezu unabhängig von RDBMS. Hier ist eine kurze Lösung, die für SQL Server spezifisch ist:

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

Sie können dies auch versuchen:

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

ende

verwenden Sie es auswählen

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

Ausgabe wird sein 

 enter image description here

2
atik sarker

@ Sqillers Funktion für meine Zwecke aktualisiert

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
1
Josh Jay

Ich fand, dass dies funktioniert, wenn es in einem (123) - 456-7890-Format fehlt. 

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

Sie können FORMAT verwenden, wenn Ihre Spalte eine Zahl ist. Syntax wie FORMAT (Wert, Format [ Kultur]) Wird verwendet wie FORMAT ( @d, 'D', 'en-US' ) oder FORMAT(123456789,'###-##-####') (aber dies funktioniert nur für SQL Server 2012 und danach

Im Gebrauch wie UPDATE TABLE_NAME SET COLUMN_NAME = FORMAT(COLUMN_NAME ,'###-##-####')

Und 

wenn Ihre Kolumne Varchar oder Nvarchar ist, verwenden Sie diese Option CONCAT(SUBSTRING(CELLPHONE,0,4),' ',SUBSTRING(CELLPHONE,4,3),'',SUBSTRING(CELLPHONE,7,2) ,' ',SUBSTRING(CELLPHONE,9,2) )

Sie können immer Hilfe von bekommen 

https://msdn.Microsoft.com/de-de/library/hh213505.aspx

0
Toprak

Wenn Sie nur die Ausgabe formatieren möchten, müssen Sie keine neue Tabelle oder Funktion erstellen. In diesem Szenario befand sich die Vorwahl in separaten Feldern. Ich verwende field1, field2, um nur zu veranschaulichen, dass Sie andere Felder in derselben Abfrage auswählen können:

area  phone
213   8962102

Aussage auswählen:

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

Beispiel OUTPUT:

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