Här är några exempel på formatering av telefonnummer i SQL Server.
Detta inkluderar exempel på formatering av nummer i E.164-format (för internationella nummer), införande av landskod och riktnummer, samt utelämnande av inledande nolla från landskoden vid behov.
Numeriska telefonnummer
Om telefonnumret är lagrat som ett numeriskt värde (vilket det inte borde vara) kan du använda FORMAT()
funktion för att formatera det som telefonnummer.
Exempel:
SELECT FORMAT(0234567890, '000-000-0000');
Resultat:
023-456-7890
Det första argumentet är telefonnumret och det andra argumentet är formatsträngen. I det här exemplet använder jag en anpassad formatsträng. Du kan justera formatsträngen så att den passar det önskade telefonnummerformatet:
SELECT FORMAT(0234567890, '(000) 000-0000');
Resultat:
(023) 456-7890
Det är viktigt att veta vad formatsträngarna faktiskt gör. När du använder nollor måste du se till att telefonnumret faktiskt har siffror på varje plats där det finns en nollformatspecifikation (annars kan du av misstag lägga till nollor till numret).
Du måste också se till att det finns en formatspecifikation som matchar varje siffra (annars tar du bort siffror från telefonnumret).
Ett annat sätt att uttrycka formatsträngen är med #
formatspecifikation. Detta kommer dock att resultera i att eventuella inledande nollor tas bort från telefonnumret.
Här är ett exempel för att illustrera vad jag menar:
SELECT
FORMAT(0234567890, '000-000-0000') AS "000-000-0000",
FORMAT(0234567890, '###-###-####') AS "###-###-####";
Resultat:
+----------------+----------------+ | 000-000-0000 | ###-###-#### | |----------------+----------------| | 023-456-7890 | 23-456-7890 | +----------------+----------------+
FORMAT()
Funktionen accepterar endast numeriska typer och datetime-värden. Om det inmatade telefonnumret faktiskt inte är en numerisk typ, kommer du förmodligen att få ett felmeddelande, ungefär så här:
SELECT FORMAT('0234567890', '000-000-0000');
Resultat:
Msg 8116, Level 16, State 1, Line 1 Argument data type varchar is invalid for argument 1 of format function.
I sådana fall är det lätt nog att konvertera värdet till en numerisk typ:
SELECT FORMAT(CAST('0234567890' AS int), '000-000-0000');
Resultat:
023-456-7890
Men telefonnummer bör ändå inte lagras som numeriska typer.
Numeriska värden kan avrundas uppåt eller nedåt, få beräkningar utförda på dem, få obetydliga nollor bort automatiskt, etc.
Telefonnummer är ett fast värde. Varje siffra är signifikant (inklusive inledande nollor). Vi vill inte att inledande nollor ska försvinna om vi inte uttryckligen kräver detta (till exempel för en landskod). Och vi vill inte att våra telefonnummer oavsiktligt avrundas uppåt eller nedåt. Och det är osannolikt att du någonsin kommer att behöva utföra beräkningar på dina telefonnummer.
Så det är därför mer meningsfullt att lagra telefonnummer som en sträng. Om du konverterar dem till en numerisk typ innan du formaterar dem (som i exemplet ovan) kan det fortfarande leda till oväntade ändringar av numret.
Om telefonnumret redan är en sträng, försök sedan med följande metod.
Telefonnummer lagrade som strängar
Om telefonnumret är lagrat som en sträng kan du använda STUFF()
funktion för att infoga lämpliga strängar i telefonnumret på relevanta platser.
Exempel:
SELECT
STUFF(STUFF('0234567890', 7, 0, '-'), 4, 0, '-') AS "Format 1",
STUFF(STUFF(STUFF('0234567890', 7, 0, '-'), 4, 0, ') '), 1, 0, '(') AS "Format 2";
Resultat:
+--------------+----------------+ | Format 1 | Format 2 | |--------------+----------------| | 023-456-7890 | (023) 456-7890 | +--------------+----------------+
Det första argumentet är den ursprungliga strängen (i detta fall telefonnumret), och det fjärde argumentet är strängen som ska infogas. Det andra argumentet anger var det fjärde argumentet ska infogas.
Det tredje argumentet anger hur många tecken som ska tas bort från den ursprungliga strängen (om du vill ersätta vissa tecken med den nya strängen). I vårt fall vill vi inte ta bort några tecken, och därför använder vi 0
.
Beroende på formatet på det ursprungliga telefonnumret är ett annat sätt att göra det att använda REPLACE()
fungera. Ett exempel på var detta kan vara användbart är när telefonnumret redan är formaterat med en avgränsare, men det måste ersättas med en annan avgränsare:
SELECT REPLACE('023 456 7890', ' ', '-');
Resultat:
023-456-7890
Internationella nummer
E.164 är en internationell standard som definierar formatet för internationella telefonnummer.
E.164-nummer är formaterade [+][country code][area code][local phone number]
och kan ha högst femton siffror.
Här är ett exempel som använder två metoder för att sammanfoga landsnumret, riktnumret och telefonnumret:
SELECT
CONCAT('+', '1', '415', '4567890') AS 'CONCAT() Function',
'+' + '1' + '415' + '4567890' AS 'Concatenation Operator';
Resultat:
+---------------------+--------------------------+ | CONCAT() Function | Concatenation Operator | |---------------------+--------------------------| | +14154567890 | +14154567890 | +---------------------+--------------------------+
Den första metoden använder CONCAT()
funktion, och den andra använder sammanlänkningsoperatorn (+
).
Det exemplet formaterar ett USA-baserat nummer. I många länder har riktnumret en inledande nolla som måste tas bort när E.164-formatet används.
Ett sätt att undertrycka inledande nollor är att konvertera riktnumret till ett numeriskt värde och tillbaka igen.
Här är ett exempel på hur man använder den tekniken på ett nummer baserat i Storbritannien:
SELECT CONCAT(
'+',
'44',
CAST(CAST('020' AS int) AS varchar(3)),
'34567890'
);
Resultat:
+442034567890
I det här fallet togs den inledande nollan bort.
Här är samma kod som körs mot det tidigare USA-baserade numret (som inte använder en inledande nolla i landskoden):
SELECT CONCAT(
'+',
'1',
CAST(CAST('415' AS int) AS varchar(3)),
'4567890'
);
Resultat:
+14154567890
Den här gången förblev landskoden på tre siffror.