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

Formattare un numero di telefono in SQL Server (T-SQL)

Di seguito sono riportati alcuni esempi di formattazione dei numeri di telefono in SQL Server.

Ciò include esempi di formattazione dei numeri in formato E.164 (per i numeri internazionali), anteponendo il prefisso internazionale e il prefisso internazionale, nonché omettendo lo zero iniziale dal prefisso internazionale quando richiesto.

Numeri di telefono numerici

Se il numero di telefono è memorizzato come valore numerico (cosa che non dovrebbe essere), puoi utilizzare il FORMAT() funzione per formattarlo come numero di telefono.

Esempio:

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

Risultato:

023-456-7890

Il primo argomento è il numero di telefono e il secondo argomento è la stringa di formato. In questo esempio sto usando una stringa di formato personalizzata. È possibile regolare la stringa di formato per adattarla al formato del numero di telefono desiderato:

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

Risultato:

(023) 456-7890

È importante sapere cosa fanno effettivamente le stringhe di formato. Quando usi gli zeri, devi assicurarti che il numero di telefono contenga effettivamente cifre in ogni punto in cui è presente un identificatore di formato zero (altrimenti potresti aggiungere zeri accidentalmente al numero).

Dovrai anche assicurarti che ci sia un identificatore di formato che corrisponda a ciascuna cifra (altrimenti eliminerai le cifre dal numero di telefono).

Un altro modo per esprimere la stringa di formato è con # identificatore di formato. Tuttavia, ciò comporterà la rimozione di eventuali zeri iniziali dal numero di telefono.

Ecco un esempio per illustrare cosa intendo:

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

Risultato:

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

Il FORMAT() la funzione accetta solo tipi numerici e valori datetime. Se il numero di telefono inserito non è in realtà un tipo numerico, probabilmente riceverai un errore, qualcosa del genere:

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

Risultato:

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

In questi casi, è abbastanza facile convertire il valore in un tipo numerico:

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

Risultato:

023-456-7890

Ma i numeri di telefono non dovrebbero comunque essere memorizzati come tipi numerici.

I valori numerici possono essere arrotondati per eccesso o per difetto, eseguire calcoli su di essi, rimuovere automaticamente gli zeri insignificanti, ecc.

I numeri di telefono sono un valore fisso. Ogni cifra è significativa (compresi gli zeri iniziali). Non vogliamo che gli zeri iniziali scompaiano a meno che non lo richiediamo esplicitamente (per un codice paese, ad esempio). E non vogliamo che i nostri numeri di telefono vengano inavvertitamente arrotondati per eccesso o per difetto. Ed è improbabile che tu debba mai eseguire calcoli sui tuoi numeri di telefono.

Quindi ha quindi più senso memorizzare i numeri di telefono come una stringa. La loro conversione in un tipo numerico prima di formattarli (come nell'esempio sopra) potrebbe comunque comportare modifiche impreviste al numero.

Se il numero di telefono è già una stringa, prova il metodo seguente.

Numeri di telefono memorizzati come stringhe

Se il numero di telefono è memorizzato come stringa, puoi utilizzare il STUFF() funzione per inserire le stringhe appropriate nel numero di telefono nei punti pertinenti.

Esempi:

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

Risultato:

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

Il primo argomento è la stringa originale (in questo caso il numero di telefono) e il quarto argomento è la stringa da inserire. Il secondo argomento specifica dove inserire il quarto argomento.

Il terzo argomento specifica quanti caratteri eliminare dalla stringa originale (nel caso si desideri sostituire determinati caratteri con la nuova stringa). Nel nostro caso, non vogliamo eliminare alcun carattere, quindi utilizziamo 0 .

A seconda del formato del numero di telefono originale, un altro modo per farlo è usare il REPLACE() funzione. Un esempio di dove potrebbe essere utile è quando il numero di telefono è già formattato con un separatore, ma deve essere sostituito con un altro separatore:

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

Risultato:

023-456-7890

Numeri internazionali

E.164 è uno standard internazionale che definisce il formato per i numeri telefonici internazionali.

I numeri E.164 sono formattati [+][country code][area code][local phone number] e può avere un massimo di quindici cifre.

Ecco un esempio che utilizza due metodi per concatenare il prefisso internazionale, il prefisso e il numero di telefono:

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

Risultato:

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

Il primo metodo utilizza CONCAT() e il secondo usa l'operatore di concatenazione (+ ).

Quell'esempio formatta un numero con sede negli Stati Uniti. In molti paesi, il prefisso ha uno zero iniziale che deve essere eliminato quando si utilizza il formato E.164.

Un modo per eliminare gli zeri iniziali consiste nel convertire il prefisso in un valore numerico e viceversa.

Ecco un esempio di utilizzo di tale tecnica su un numero con sede nel Regno Unito:

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

Risultato:

+442034567890

In questo caso lo zero iniziale è stato eliminato.

Ecco lo stesso codice eseguito rispetto al precedente numero con sede negli Stati Uniti (che non utilizza uno zero iniziale nel prefisso internazionale):

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

Risultato:

+14154567890

Questa volta il prefisso internazionale è rimasto a tre cifre.