sql >> Database >  >> RDS >> Sqlserver

Een telefoonnummer opmaken in SQL Server (T-SQL)

Hier zijn enkele voorbeelden van het opmaken van telefoonnummers in SQL Server.

Dit omvat voorbeelden van het formatteren van getallen in E.164-indeling (voor internationale nummers), die voorafgaan aan de landcode en het netnummer, evenals het weglaten van de voorloopnul in de landcode indien nodig.

Numerieke telefoonnummers

Als het telefoonnummer is opgeslagen als een numerieke waarde (wat niet het geval zou moeten zijn), kunt u de FORMAT() gebruiken functie om het als telefoonnummer te formatteren.

Voorbeeld:

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

Resultaat:

023-456-7890

Het eerste argument is het telefoonnummer en het tweede argument is de opmaakreeks. In dit voorbeeld gebruik ik een aangepaste opmaakreeks. U kunt de notatiereeks aanpassen aan het gewenste telefoonnummerformaat:

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

Resultaat:

(023) 456-7890

Het is belangrijk om te weten wat de formaatstrings eigenlijk doen. Wanneer u nullen gebruikt, moet u ervoor zorgen dat het telefoonnummer daadwerkelijk cijfers heeft op elke plaats waar een nulnotatie-specificatie is (anders zou u per ongeluk nullen aan het nummer kunnen toevoegen).

Je moet er ook voor zorgen dat er een formaatspecificatie is die overeenkomt met elk cijfer (anders verwijder je cijfers uit het telefoonnummer).

Een andere manier om de opmaakreeks uit te drukken is met de # formaat specificatie. Dit zal er echter toe leiden dat eventuele voorloopnullen van het telefoonnummer worden verwijderd.

Hier is een voorbeeld om te illustreren wat ik bedoel:

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

Resultaat:

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

De FORMAT() functie accepteert alleen numerieke typen en datetime-waarden. Als het ingevoerde telefoonnummer niet echt een numeriek type is, krijgt u waarschijnlijk een foutmelding, ongeveer als volgt:

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

Resultaat:

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

In dergelijke gevallen is het eenvoudig genoeg om de waarde om te zetten in een numeriek type:

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

Resultaat:

023-456-7890

Maar telefoonnummers mogen sowieso niet als numerieke typen worden opgeslagen.

Numerieke waarden kunnen naar boven of naar beneden worden afgerond, er kunnen berekeningen op worden uitgevoerd, onbeduidende nullen worden automatisch verwijderd, enz.

Telefoonnummers zijn een vaste waarde. Elk cijfer is significant (inclusief voorloopnullen). We willen niet dat voorloopnullen verloren gaan, tenzij we dit expliciet vereisen (bijvoorbeeld voor een landcode). En we willen niet dat onze telefoonnummers per ongeluk naar boven of naar beneden worden afgerond. En het is onwaarschijnlijk dat u ooit berekeningen op uw telefoonnummers hoeft uit te voeren.

Het is daarom logischer om telefoonnummers als een string op te slaan. Als u ze converteert naar een numeriek type voordat u ze formatteert (zoals in het bovenstaande voorbeeld), kan dit nog steeds leiden tot onverwachte wijzigingen in het nummer.

Als het telefoonnummer al een string is, probeer dan de volgende methode.

Telefoonnummers opgeslagen als strings

Als het telefoonnummer is opgeslagen als een tekenreeks, kunt u de STUFF() . gebruiken functie om de juiste strings in het telefoonnummer in te voegen op de relevante plaatsen.

Voorbeelden:

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

Resultaat:

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

Het eerste argument is de originele string (in dit geval het telefoonnummer) en het vierde argument is de string die moet worden ingevoegd. Het tweede argument geeft aan waar het vierde argument moet worden ingevoegd.

Het derde argument geeft aan hoeveel tekens uit de oorspronkelijke tekenreeks moeten worden verwijderd (voor het geval u bepaalde tekens door de nieuwe tekenreeks wilt vervangen). In ons geval willen we geen tekens verwijderen en daarom gebruiken we 0 .

Afhankelijk van het formaat van het originele telefoonnummer, is een andere manier om dit te doen het gebruik van de REPLACE() functie. Dit kan bijvoorbeeld handig zijn als het telefoonnummer al is opgemaakt met een scheidingsteken, maar moet worden vervangen door een ander scheidingsteken:

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

Resultaat:

023-456-7890

Internationale nummers

E.164 is een internationale standaard die het formaat voor internationale telefoonnummers definieert.

E.164-nummers hebben de indeling [+][country code][area code][local phone number] en kan maximaal vijftien cijfers bevatten.

Hier is een voorbeeld waarbij twee methoden worden gebruikt om de landcode, het netnummer en het telefoonnummer samen te voegen:

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

Resultaat:

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

De eerste methode gebruikt de CONCAT() functie, en de tweede gebruikt de aaneenschakelingsoperator (+ ).

Dat voorbeeld maakt een Amerikaans nummer op. In veel landen heeft het netnummer een voorloopnul die moet worden verwijderd bij gebruik van het E.164-formaat.

Een manier om voorloopnullen te onderdrukken, is door het netnummer om te zetten in een numerieke waarde en weer terug.

Hier is een voorbeeld van het gebruik van die techniek op een nummer in het VK:

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

Resultaat:

+442034567890

In dit geval is de voorloopnul weggelaten.

Hier is dezelfde code uitgevoerd tegen het vorige in de VS gebaseerde nummer (dat geen voorloopnul gebruikt in de landcode):

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

Resultaat:

+14154567890

Deze keer bleef de landcode op drie cijfers staan.


  1. Hoe converteer je alle tabellen van MyISAM naar InnoDB?

  2. Hoe verwijder je meerdere intervalpartities op basis van datum?

  3. Afstemmen van invoer/uitvoer (I/O) bewerkingen voor PostgreSQL

  4. LOAD DATA LOCAL INFILE geeft de fout De gebruikte opdracht is niet toegestaan ​​met deze MySQL-versie