Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Formatieren einer Telefonnummer in SQL Server (T-SQL)

Hier sind einige Beispiele für die Formatierung von Telefonnummern in SQL Server.

Dazu gehören Beispiele für das Formatieren von Nummern im E.164-Format (für internationale Nummern), das Voranstellen der Landesvorwahl und Ortsvorwahl sowie das Weglassen der führenden Null in der Landesvorwahl, falls erforderlich.

Numerische Telefonnummern

Wenn die Telefonnummer als numerischer Wert gespeichert ist (was nicht sein sollte), können Sie das FORMAT() verwenden Funktion, um es als Telefonnummer zu formatieren.

Beispiel:

SELECT FORMAT(0234567890, '000-000-0000');

Ergebnis:

023-456-7890

Das erste Argument ist die Telefonnummer und das zweite Argument ist die Formatzeichenfolge. In diesem Beispiel verwende ich eine benutzerdefinierte Formatzeichenfolge. Sie können den Formatstring an das gewünschte Rufnummernformat anpassen:

SELECT FORMAT(0234567890, '(000) 000-0000');

Ergebnis:

(023) 456-7890

Es ist wichtig zu wissen, was die Formatzeichenfolgen tatsächlich tun. Wenn Sie Nullen verwenden, müssen Sie sicherstellen, dass die Telefonnummer an jeder Stelle, an der ein Nullformatbezeichner steht, tatsächlich Ziffern enthält (andernfalls könnten Sie versehentlich Nullen an die Nummer anhängen).

Sie müssen auch sicherstellen, dass für jede Ziffer ein Formatbezeichner vorhanden ist (andernfalls löschen Sie Ziffern aus der Telefonnummer).

Eine andere Möglichkeit, den Formatstring auszudrücken, ist der # Formatbezeichner. Dies führt jedoch dazu, dass alle führenden Nullen aus der Telefonnummer entfernt werden.

Hier ist ein Beispiel, um zu veranschaulichen, was ich meine:

SELECT 
    FORMAT(0234567890, '000-000-0000') AS "000-000-0000",
    FORMAT(0234567890, '###-###-####') AS "###-###-####";

Ergebnis:

+----------------+----------------+
| 000-000-0000   | ###-###-####   |
|----------------+----------------|
| 023-456-7890   | 23-456-7890    |
+----------------+----------------+

Das FORMAT() Die Funktion akzeptiert nur numerische Typen und datetime-Werte. Wenn die eingegebene Telefonnummer kein numerischer Typ ist, erhalten Sie wahrscheinlich eine Fehlermeldung wie diese:

SELECT FORMAT('0234567890', '000-000-0000');

Ergebnis:

Msg 8116, Level 16, State 1, Line 1
Argument data type varchar is invalid for argument 1 of format function.

In solchen Fällen ist es einfach genug, den Wert in einen numerischen Typ umzuwandeln:

SELECT FORMAT(CAST('0234567890' AS int), '000-000-0000');

Ergebnis:

023-456-7890

Aber Telefonnummern sollten sowieso nicht als numerische Typen gespeichert werden.

Numerische Werte können auf- oder abgerundet, verrechnet, unbedeutende Nullen automatisch entfernt werden usw.

Telefonnummern sind ein fester Wert. Jede Ziffer ist signifikant (einschließlich führender Nullen). Wir möchten nicht, dass führende Nullen fehlen, es sei denn, wir verlangen dies ausdrücklich (z. B. für einen Ländercode). Und wir möchten nicht, dass unsere Telefonnummern versehentlich auf- oder abgerundet werden. Und es ist unwahrscheinlich, dass Sie jemals Berechnungen für Ihre Telefonnummern durchführen müssen.

Daher ist es sinnvoller, Telefonnummern als String zu speichern. Das Konvertieren in einen numerischen Typ vor dem Formatieren (wie im obigen Beispiel) kann dennoch zu unerwarteten Änderungen an der Zahl führen.

Wenn die Telefonnummer bereits eine Zeichenfolge ist, versuchen Sie die folgende Methode.

Telefonnummern als Zeichenfolgen gespeichert

Wenn die Telefonnummer als Zeichenfolge gespeichert ist, können Sie den STUFF() verwenden Funktion, um die entsprechenden Zeichenfolgen an den entsprechenden Stellen in die Telefonnummer einzufügen.

Beispiele:

SELECT
    STUFF(STUFF('0234567890', 7, 0, '-'), 4, 0, '-') AS "Format 1",
    STUFF(STUFF(STUFF('0234567890', 7, 0, '-'), 4, 0, ') '), 1, 0, '(') AS "Format 2";

Ergebnis:

+--------------+----------------+
| Format 1     | Format 2       |
|--------------+----------------|
| 023-456-7890 | (023) 456-7890 |
+--------------+----------------+

Das erste Argument ist die ursprüngliche Zeichenfolge (in diesem Fall die Telefonnummer), und das vierte Argument ist die einzufügende Zeichenfolge. Das zweite Argument gibt an, wo das vierte Argument eingefügt werden soll.

Das dritte Argument gibt an, wie viele Zeichen aus der ursprünglichen Zeichenfolge gelöscht werden sollen (falls Sie bestimmte Zeichen durch die neue Zeichenfolge ersetzen möchten). In unserem Fall möchten wir keine Zeichen löschen und verwenden daher 0 .

Abhängig vom Format der ursprünglichen Telefonnummer ist eine andere Möglichkeit die Verwendung von REPLACE() Funktion. Dies könnte beispielsweise nützlich sein, wenn die Telefonnummer bereits mit einem Trennzeichen formatiert ist, aber durch ein anderes Trennzeichen ersetzt werden muss:

SELECT REPLACE('023 456 7890', ' ', '-');

Ergebnis:

023-456-7890

Internationale Nummern

E.164 ist ein internationaler Standard, der das Format für internationale Telefonnummern definiert.

E.164-Nummern haben das Format [+][country code][area code][local phone number] und darf maximal fünfzehn Stellen lang sein.

Hier ist ein Beispiel, das zwei Methoden verwendet, um die Landesvorwahl, die Ortsvorwahl und die Telefonnummer zu verketten:

SELECT 
    CONCAT('+', '1', '415', '4567890') AS 'CONCAT() Function',
    '+' + '1' + '415' + '4567890' AS 'Concatenation Operator';

Ergebnis:

+---------------------+--------------------------+
| CONCAT() Function   | Concatenation Operator   |
|---------------------+--------------------------|
| +14154567890        | +14154567890             |
+---------------------+--------------------------+

Die erste Methode verwendet CONCAT() Funktion, und die zweite verwendet den Verkettungsoperator (+ ).

Dieses Beispiel formatiert eine US-basierte Nummer. In vielen Ländern hat die Vorwahl eine führende Null, die bei Verwendung des E.164-Formats weggelassen werden muss.

Eine Möglichkeit, führende Nullen zu unterdrücken, besteht darin, die Vorwahl in einen numerischen Wert umzuwandeln und wieder zurück.

Hier ist ein Beispiel für die Verwendung dieser Technik bei einer in Großbritannien ansässigen Nummer:

SELECT CONCAT(
        '+', 
        '44', 
        CAST(CAST('020' AS int) AS varchar(3)), 
        '34567890'
        );

Ergebnis:

+442034567890

In diesem Fall wurde die führende Null weggelassen.

Hier ist derselbe Code, der mit der vorherigen US-basierten Nummer ausgeführt wird (die keine führende Null im Ländercode verwendet):

SELECT CONCAT(
        '+', 
        '1', 
        CAST(CAST('415' AS int) AS varchar(3)), 
        '4567890'
        );

Ergebnis:

+14154567890

Diesmal blieb der Ländercode dreistellig.