sql >> Database teknologi >  >> RDS >> Sqlserver

Formater et telefonnummer i SQL Server (T-SQL)

Her er nogle eksempler på formatering af telefonnumre i SQL Server.

Dette inkluderer eksempler på formatering af tal i E.164-format (for internationale numre), foranstående landekode og områdenummer samt udeladelse af indledende nul fra landekoden, når det kræves.

Numeriske telefonnumre

Hvis telefonnummeret er gemt som en numerisk værdi (hvilket det ikke burde være), kan du bruge FORMAT() funktion til at formatere det som telefonnummer.

Eksempel:

VÆLG FORMAT(0234567890, '000-000-0000'); 

Resultat:

023-456-7890

Det første argument er telefonnummeret, og det andet argument er formatstrengen. I dette eksempel bruger jeg en tilpasset formatstreng. Du kan justere formatstrengen, så den passer til det ønskede telefonnummerformat:

VÆLG FORMAT(0234567890, '(000) 000-0000'); 

Resultat:

(023) 456-7890

Det er vigtigt at vide, hvad formatstrengene rent faktisk gør. Når du bruger nuller, skal du sørge for, at telefonnummeret rent faktisk har cifre alle steder, hvor der er en nulformatspecifikation (ellers kan du ved et uheld tilføje nuller til nummeret).

Du skal også sikre dig, at der er en formatspecifikation, der matcher hvert ciffer (ellers sletter du cifre fra telefonnummeret).

En anden måde at udtrykke formatstrengen på er med # formatspecifikation. Dette vil dog resultere i, at eventuelle indledende nuller fjernes fra telefonnummeret.

Her er et eksempel for at illustrere, hvad jeg mener:

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

Resultat:

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

FORMAT() funktion accepterer kun numeriske typer og dato-tidsværdier. Hvis det indtastede telefonnummer faktisk ikke er en numerisk type, vil du sandsynligvis få en fejl, noget som denne:

VÆLG FORMAT('0234567890', '000-000-0000'); 

Resultat:

Besked 8116, niveau 16, tilstand 1, linje 1Argumentdatatypen varchar er ugyldig for argument 1 for formatfunktionen.

I sådanne tilfælde er det nemt nok at konvertere værdien til en numerisk type:

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

Resultat:

023-456-7890

Men telefonnumre bør alligevel ikke gemmes som numeriske typer.

Numeriske værdier kan rundes op eller ned, få foretaget beregninger på dem, få ubetydelige nuller fjernet automatisk osv.

Telefonnumre er en fast værdi. Hvert ciffer er signifikant (inklusive indledende nuller). Vi ønsker ikke, at indledende nuller forsvinder, medmindre vi udtrykkeligt kræver dette (for eksempel for en landekode). Og vi ønsker ikke, at vores telefonnumre utilsigtet rundes op eller ned. Og det er usandsynligt, at du nogensinde får brug for at udføre beregninger på dine telefonnumre.

Så det giver derfor mere mening at gemme telefonnumre som en streng. Konvertering af dem til en numerisk type før formatering af dem (som i eksemplet ovenfor) kan stadig resultere i, at der foretages uventede ændringer af tallet.

Hvis telefonnummeret allerede er en streng, så prøv følgende metode.

Telefonnumre gemt som strenge

Hvis telefonnummeret er gemt som en streng, kan du bruge STUFF() funktion til at indsætte de relevante strenge i telefonnummeret på de relevante steder.

Eksempler:

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

Resultat:

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

Det første argument er den oprindelige streng (i dette tilfælde telefonnummeret), og det fjerde argument er strengen, der skal indsættes. Det andet argument angiver, hvor det fjerde argument skal indsættes.

Det tredje argument angiver, hvor mange tegn der skal slettes fra den originale streng (i tilfælde af at du vil erstatte visse tegn med den nye streng). I vores tilfælde ønsker vi ikke at slette nogen tegn, og derfor bruger vi 0 .

Afhængigt af formatet på det originale telefonnummer er en anden måde at gøre det på at bruge REPLACE() fungere. Et eksempel på, hvor dette kan være nyttigt, er, når telefonnummeret allerede er formateret med en separator, men det skal erstattes med en anden separator:

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

Resultat:

023-456-7890

Internationale numre

E.164 er en international standard, der definerer formatet for internationale telefonnumre.

E.164-numre er formateret [+][landekode][områdenummer][lokalt telefonnummer] og kan maksimalt have femten cifre.

Her er et eksempel, der bruger to metoder til at sammenkæde landekoden, områdenummeret og telefonnummeret:

VÆLG CONCAT('+', '1', '415', '4567890') SOM 'CONCAT() Funktion', '+' + '1' + '415' + '4567890' AS ' Sammenkædningsoperatør'; 

Resultat:

+---------------------+------------------------ --+| CONCAT() Funktion | Sammenkædningsoperatør ||----------------------+------------------------ --|| +14154567890 | +14154567890 |+---------------------+------------------------ --+

Den første metode bruger CONCAT() funktion, og den anden bruger sammenkædningsoperatoren (+ ).

Dette eksempel formaterer et amerikansk baseret nummer. I mange lande har områdenummeret et indledende nul, som skal slettes, når du bruger E.164-formatet.

En måde at undertrykke indledende nuller på er at konvertere områdekoden til en numerisk værdi og tilbage igen.

Her er et eksempel på brug af denne teknik på et UK-baseret nummer:

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

Resultat:

+442034567890

I dette tilfælde blev det indledende nul slettet.

Her er den samme kode, der køres mod det tidligere USA-baserede nummer (som ikke bruger et indledende nul i landekoden):

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

Resultat:

+14154567890

Denne gang forblev landekoden på tre cifre.


  1. Galera Cluster Recovery 101 - Et dybt dyk ind i netværkspartitionering

  2. kan ikke indlæse oci8 -> Fatal fejl:Kald til udefineret funktion oci_connect()

  3. Forebyggelse af SQL-injektion i ASP.Net

  4. Sådan får du gårsdagens date i Oracle