Zde je několik příkladů formátování telefonních čísel v SQL Server.
To zahrnuje příklady formátování čísel ve formátu E.164 (pro mezinárodní čísla), předřazení kódu země a kódu oblasti a také vynechání úvodní nuly z kódu země, je-li to vyžadováno.
Číselná telefonní čísla
Pokud je telefonní číslo uloženo jako číselná hodnota (což by nemělo být), můžete použít FORMAT()
funkci naformátovat jako telefonní číslo.
Příklad:
SELECT FORMAT(0234567890, '000-000-0000');
Výsledek:
023-456-7890
První argument je telefonní číslo a druhý argument je formátovací řetězec. V tomto příkladu používám vlastní formátovací řetězec. Formátovací řetězec můžete upravit tak, aby vyhovoval požadovanému formátu telefonního čísla:
SELECT FORMAT(0234567890, '(000) 000-0000');
Výsledek:
(023) 456-7890
Je důležité vědět, co formátovací řetězce skutečně dělají. Při použití nul se musíte ujistit, že telefonní číslo skutečně obsahuje číslice na každém místě, kde je specifikátor nulového formátu (jinak byste k číslu mohli omylem přidat nuly).
Také se musíte ujistit, že existuje specifikátor formátu, který odpovídá každé číslici (jinak číslice z telefonního čísla smažete).
Dalším způsobem, jak vyjádřit formátovací řetězec, je #
specifikátor formátu. To však povede k odstranění jakýchkoli úvodních nul z telefonního čísla.
Zde je příklad pro ilustraci toho, co mám na mysli:
SELECT
FORMAT(0234567890, '000-000-0000') AS "000-000-0000",
FORMAT(0234567890, '###-###-####') AS "###-###-####";
Výsledek:
+----------------+----------------+ | 000-000-0000 | ###-###-#### | |----------------+----------------| | 023-456-7890 | 23-456-7890 | +----------------+----------------+
FORMAT()
funkce přijímá pouze číselné typy a hodnoty data a času. Pokud zadané telefonní číslo není ve skutečnosti číselného typu, pravděpodobně se zobrazí chyba, asi tato:
SELECT FORMAT('0234567890', '000-000-0000');
Výsledek:
Msg 8116, Level 16, State 1, Line 1 Argument data type varchar is invalid for argument 1 of format function.
V takových případech je snadné převést hodnotu na číselný typ:
SELECT FORMAT(CAST('0234567890' AS int), '000-000-0000');
Výsledek:
023-456-7890
Ale telefonní čísla by stejně neměla být uložena jako číselné typy.
Číselné hodnoty lze zaokrouhlit nahoru nebo dolů, nechat na nich provádět výpočty, automaticky odstranit nevýznamné nuly atd.
Telefonní čísla jsou pevnou hodnotou. Každá číslice je významná (včetně úvodních nul). Nechceme, aby úvodní nuly zmizely, pokud to výslovně nevyžadujeme (například pro kód země). A nechceme, aby naše telefonní čísla byla neúmyslně zaokrouhlena nahoru nebo dolů. A je nepravděpodobné, že někdy budete muset provádět výpočty na svých telefonních číslech.
Proto je smysluplnější ukládat telefonní čísla jako řetězec. Jejich převod na číselný typ před jejich formátováním (jako ve výše uvedeném příkladu) může přesto vést k neočekávaným změnám čísla.
Pokud je telefonní číslo již řetězec, zkuste následující metodu.
Telefonní čísla uložená jako řetězce
Pokud je telefonní číslo uloženo jako řetězec, můžete použít STUFF()
funkce pro vložení příslušných řetězců do telefonního čísla na příslušných místech.
Příklady:
SELECT
STUFF(STUFF('0234567890', 7, 0, '-'), 4, 0, '-') AS "Format 1",
STUFF(STUFF(STUFF('0234567890', 7, 0, '-'), 4, 0, ') '), 1, 0, '(') AS "Format 2";
Výsledek:
+--------------+----------------+ | Format 1 | Format 2 | |--------------+----------------| | 023-456-7890 | (023) 456-7890 | +--------------+----------------+
První argument je původní řetězec (v tomto případě telefonní číslo) a čtvrtý argument je řetězec, který se má vložit. Druhý argument určuje, kam se má vložit čtvrtý argument.
Třetí argument určuje, kolik znaků se má odstranit z původního řetězce (v případě, že chcete nahradit určité znaky novým řetězcem). V našem případě nechceme mazat žádné znaky, a tak použijeme 0
.
V závislosti na formátu původního telefonního čísla je dalším způsobem, jak to udělat, použít REPLACE()
funkce. Příklad, kde by to mohlo být užitečné, je situace, kdy je telefonní číslo již naformátováno pomocí oddělovače, ale je třeba jej nahradit jiným oddělovačem:
SELECT REPLACE('023 456 7890', ' ', '-');
Výsledek:
023-456-7890
Mezinárodní čísla
E.164 je mezinárodní standard, který definuje formát pro mezinárodní telefonní čísla.
Čísla E.164 jsou ve formátu [+][country code][area code][local phone number]
a může mít maximálně patnáct číslic.
Zde je příklad, který používá dvě metody ke zřetězení kódu země, kódu oblasti a telefonního čísla:
SELECT
CONCAT('+', '1', '415', '4567890') AS 'CONCAT() Function',
'+' + '1' + '415' + '4567890' AS 'Concatenation Operator';
Výsledek:
+---------------------+--------------------------+ | CONCAT() Function | Concatenation Operator | |---------------------+--------------------------| | +14154567890 | +14154567890 | +---------------------+--------------------------+
První metoda používá CONCAT()
a druhý používá operátor zřetězení (+
).
Tento příklad formátuje číslo v USA. V mnoha zemích má kód oblasti úvodní nulu, kterou je třeba při použití formátu E.164 vypustit.
Jedním ze způsobů, jak potlačit jakékoli úvodní nuly, je převést kód oblasti na číselnou hodnotu a zase zpět.
Zde je příklad použití této techniky na čísle se sídlem ve Spojeném království:
SELECT CONCAT(
'+',
'44',
CAST(CAST('020' AS int) AS varchar(3)),
'34567890'
);
Výsledek:
+442034567890
V tomto případě byla vypuštěna úvodní nula.
Zde je stejný kód běžící proti předchozímu americkému číslu (které v kódu země nepoužívá úvodní nulu):
SELECT CONCAT(
'+',
'1',
CAST(CAST('415' AS int) AS varchar(3)),
'4567890'
);
Výsledek:
+14154567890
Tentokrát kód země zůstal na třech číslicích.