Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Sformatuj numer telefonu w programie SQL Server (T-SQL)

Oto kilka przykładów formatowania numerów telefonów w programie SQL Server.

Obejmuje to przykłady formatowania liczb w formacie E.164 (dla numerów międzynarodowych), poprzedzenie kodu kraju i numeru kierunkowego, a także pominięcie początkowego zera w kodzie kraju, gdy jest to wymagane.

Numeryczne numery telefonów

Jeśli numer telefonu jest przechowywany jako wartość liczbowa (co nie powinno być), możesz użyć FORMAT() funkcja, aby sformatować go jako numer telefonu.

Przykład:

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

Wynik:

023-456-7890

Pierwszy argument to numer telefonu, a drugi to ciąg formatu. W tym przykładzie używam niestandardowego ciągu formatu. Możesz dostosować ciąg formatu, aby pasował do żądanego formatu numeru telefonu:

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

Wynik:

(023) 456-7890

Ważne jest, aby wiedzieć, co faktycznie robią ciągi formatu. Używając zer, musisz upewnić się, że numer telefonu faktycznie zawiera cyfry w każdym miejscu, w którym występuje specyfikator formatu zerowego (w przeciwnym razie możesz przypadkowo dodać zera do numeru).

Musisz również upewnić się, że istnieje specyfikator formatu pasujący do każdej cyfry (w przeciwnym razie usuniesz cyfry z numeru telefonu).

Innym sposobem wyrażenia ciągu formatu jest użycie # specyfikator formatu. Spowoduje to jednak usunięcie wszelkich wiodących zer z numeru telefonu.

Oto przykład ilustrujący, co mam na myśli:

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

Wynik:

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

FORMAT() funkcja akceptuje tylko typy liczbowe i wartości daty i godziny. Jeśli wprowadzony numer telefonu nie jest w rzeczywistości typem liczbowym, prawdopodobnie pojawi się błąd, podobny do tego:

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

Wynik:

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

W takich przypadkach łatwo jest przekonwertować wartość na typ liczbowy:

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

Wynik:

023-456-7890

Ale numery telefonów i tak nie powinny być przechowywane jako typy liczbowe.

Wartości liczbowe można zaokrąglać w górę lub w dół, wykonywać na nich obliczenia, automatycznie usuwać nieznaczne zera itp.

Numery telefonów są wartością stałą. Każda cyfra jest znacząca (łącznie z wiodącymi zerami). Nie chcemy, aby zniknęły wiodące zera, chyba że wyraźnie tego wymagamy (na przykład w przypadku kodu kraju). I nie chcemy, aby nasze numery telefonów zostały przypadkowo zaokrąglone w górę lub w dół. I jest mało prawdopodobne, abyś kiedykolwiek musiał wykonywać obliczenia na swoich numerach telefonów.

Dlatego bardziej sensowne jest przechowywanie numerów telefonów jako ciągu. Konwertowanie ich na typ liczbowy przed ich sformatowaniem (jak w powyższym przykładzie) może nadal skutkować nieoczekiwanymi zmianami liczby.

Jeśli numer telefonu jest już ciągiem, wypróbuj następującą metodę.

Numery telefonów przechowywane jako ciągi

Jeśli numer telefonu jest przechowywany jako ciąg, możesz użyć STUFF() funkcja, aby wstawić odpowiednie ciągi do numeru telefonu w odpowiednich miejscach.

Przykłady:

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

Wynik:

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

Pierwszym argumentem jest oryginalny ciąg (w tym przypadku numer telefonu), a czwartym ciąg do wstawienia. Drugi argument określa, gdzie wstawić czwarty argument.

Trzeci argument określa, ile znaków należy usunąć z oryginalnego ciągu (w przypadku, gdy chcesz zastąpić niektóre znaki nowym ciągiem). W naszym przypadku nie chcemy usuwać żadnych znaków, dlatego używamy 0 .

W zależności od formatu oryginalnego numeru telefonu, innym sposobem na to jest użycie REPLACE() funkcjonować. Przykładem, w którym może to być przydatne, jest sytuacja, gdy numer telefonu jest już sformatowany z separatorem, ale należy go zastąpić innym separatorem:

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

Wynik:

023-456-7890

Numery międzynarodowe

E.164 to międzynarodowy standard definiujący format międzynarodowych numerów telefonów.

Numery E.164 mają format [+][country code][area code][local phone number] i może mieć maksymalnie piętnaście cyfr.

Oto przykład, który wykorzystuje dwie metody łączenia kodu kraju, numeru kierunkowego i numeru telefonu:

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

Wynik:

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

Pierwsza metoda używa CONCAT() funkcja, a druga używa operatora konkatenacji (+ ).

Ten przykład formatuje numer w USA. W wielu krajach numer kierunkowy ma wiodące zero, które należy usunąć w przypadku korzystania z formatu E.164.

Jednym ze sposobów na pominięcie wszelkich wiodących zer jest przekonwertowanie numeru kierunkowego na wartość liczbową i odwrotnie.

Oto przykład użycia tej techniki na numerze z Wielkiej Brytanii:

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

Wynik:

+442034567890

W tym przypadku początkowe zero zostało usunięte.

Oto ten sam kod w stosunku do poprzedniego numeru w USA (który nie używa wiodącego zera w kodzie kraju):

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

Wynik:

+14154567890

Tym razem kod kraju pozostał trzycyfrowy.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 10 wskazówek SP_EXECUTESQL, których należy unikać, aby uzyskać lepszy dynamiczny SQL

  2. Jak dodać właściwość tożsamości do istniejącej kolumny w SQL Server?

  3. SQL:Wybierz 3 najlepsze rekordy + Suma ilości

  4. Jak wyodrębnić lub przekonwertować dane czasu z ciągu w SQL Server

  5. Jak ustawić kolor paska stanu w SSMS dla różnych instancji SQL Server — samouczek SQL Server / TSQL, część 6