Ето някои примери за форматиране на телефонни номера в SQL Server.
Това включва примери за форматиране на числа във формат E.164 (за международни номера), добавяне на кода на държавата и кода на областта, както и пропускане на водеща нула от кода на държавата, когато е необходимо.
Цифрови телефонни номера
Ако телефонният номер се съхранява като числова стойност (която не трябва да бъде), можете да използвате FORMAT()
функция, за да го форматирате като телефонен номер.
Пример:
SELECT FORMAT(0234567890, '000-000-0000');
Резултат:
023-456-7890
Първият аргумент е телефонният номер, а вторият аргумент е низът за формат. В този пример използвам низ с персонализиран формат. Можете да коригирате низа за формат, за да отговаря на желания формат на телефонния номер:
SELECT FORMAT(0234567890, '(000) 000-0000');
Резултат:
(023) 456-7890
Важно е да знаете какво всъщност правят форматните низове. Когато използвате нули, ще трябва да се уверите, че телефонният номер действително има цифри на всяко място, където има спецификатор на нулев формат (в противен случай може да добавите нули към номера).
Също така ще трябва да се уверите, че има спецификатор на формат, който да съответства на всяка цифра (в противен случай ще изтриете цифри от телефонния номер).
Друг начин за изразяване на форматиращия низ е с #
спецификатор на формат. Това обаче ще доведе до премахване на всички водещи нули от телефонния номер.
Ето един пример, за да илюстрирам какво имам предвид:
SELECT
FORMAT(0234567890, '000-000-0000') AS "000-000-0000",
FORMAT(0234567890, '###-###-####') AS "###-###-####";
Резултат:
+----------------+----------------+ | 000-000-0000 | ###-###-#### | |----------------+----------------| | 023-456-7890 | 23-456-7890 | +----------------+----------------+
FORMAT()
функцията приема само числови типове и стойности за дата и час. Ако въведеният телефонен номер всъщност не е числов тип, тогава вероятно ще получите грешка, нещо като това:
SELECT FORMAT('0234567890', '000-000-0000');
Резултат:
Msg 8116, Level 16, State 1, Line 1 Argument data type varchar is invalid for argument 1 of format function.
В такива случаи е достатъчно лесно да преобразувате стойността в числов тип:
SELECT FORMAT(CAST('0234567890' AS int), '000-000-0000');
Резултат:
023-456-7890
Но така или иначе телефонните номера не трябва да се съхраняват като числови типове.
Числовите стойности могат да се закръглят нагоре или надолу, да се извършват изчисления върху тях, да се премахват автоматично незначителни нули и т.н.
Телефонните номера са фиксирана стойност. Всяка цифра е значима (включително водещите нули). Не искаме водещите нули да липсват, освен ако изрично не изискваме това (например за код на държава). И ние не искаме телефонните ни номера да бъдат неволно закръглени нагоре или надолу. И е малко вероятно някога да ви се наложи да извършвате изчисления на телефонните си номера.
Следователно е по-разумно телефонните номера да се съхраняват като низ. Преобразуването им в числов тип преди форматирането им (както в горния пример) все още може да доведе до неочаквани промени в числото.
Ако телефонният номер вече е низ, опитайте следния метод.
Телефонни номера, съхранени като низове
Ако телефонният номер е съхранен като низ, можете да използвате STUFF()
функция за вмъкване на съответните низове в телефонния номер на съответните места.
Примери:
SELECT
STUFF(STUFF('0234567890', 7, 0, '-'), 4, 0, '-') AS "Format 1",
STUFF(STUFF(STUFF('0234567890', 7, 0, '-'), 4, 0, ') '), 1, 0, '(') AS "Format 2";
Резултат:
+--------------+----------------+ | Format 1 | Format 2 | |--------------+----------------| | 023-456-7890 | (023) 456-7890 | +--------------+----------------+
Първият аргумент е оригиналният низ (в този случай телефонният номер), а четвъртият аргумент е низът за вмъкване. Вторият аргумент указва къде да се вмъкне четвъртият аргумент.
Третият аргумент указва колко знака да изтриете от оригиналния низ (в случай, че искате да замените определени символи с новия низ). В нашия случай не искаме да изтриваме никакви знаци и затова използваме 0
.
В зависимост от формата на оригиналния телефонен номер, друг начин да го направите е да използвате REPLACE()
функция. Пример за това, когато това може да бъде полезно е, когато телефонният номер вече е форматиран с разделител, но трябва да бъде заменен с друг разделител:
SELECT REPLACE('023 456 7890', ' ', '-');
Резултат:
023-456-7890
Международни номера
E.164 е международен стандарт, който определя формата за международни телефонни номера.
Номерата E.164 са форматирани [+][country code][area code][local phone number]
и може да има максимум петнадесет цифри.
Ето пример, който използва два метода за свързване на кода на държавата, кода на областта и телефонния номер:
SELECT
CONCAT('+', '1', '415', '4567890') AS 'CONCAT() Function',
'+' + '1' + '415' + '4567890' AS 'Concatenation Operator';
Резултат:
+---------------------+--------------------------+ | CONCAT() Function | Concatenation Operator | |---------------------+--------------------------| | +14154567890 | +14154567890 | +---------------------+--------------------------+
Първият метод използва CONCAT()
функция, а вторият използва оператора за конкатенация (+
).
Този пример форматира базиран в САЩ номер. В много страни кодът на областта има водеща нула, която трябва да бъде изпусната, когато се използва формат E.164.
Един от начините за потискане на всички водещи нули е да преобразувате кода на областта в числова стойност и обратно.
Ето пример за използване на тази техника на базиран в Обединеното кралство номер:
SELECT CONCAT(
'+',
'44',
CAST(CAST('020' AS int) AS varchar(3)),
'34567890'
);
Резултат:
+442034567890
В този случай водещата нула беше изпусната.
Ето същия код, който се изпълнява срещу предишния базиран в САЩ номер (който не използва водеща нула в кода на държавата):
SELECT CONCAT(
'+',
'1',
CAST(CAST('415' AS int) AS varchar(3)),
'4567890'
);
Резултат:
+14154567890
Този път кодът на държавата остана трицифрен.