sql >> Base de Datos >  >> RDS >> Sqlserver

Dar formato a un número de teléfono en SQL Server (T-SQL)

Estos son algunos ejemplos de cómo formatear números de teléfono en SQL Server.

Esto incluye ejemplos de formato de números en formato E.164 (para números internacionales), anteponiendo el código de país y el código de área, y omitiendo el cero inicial del código de país cuando sea necesario.

Números de teléfono numéricos

Si el número de teléfono se almacena como un valor numérico (que no debería ser), puede usar el FORMAT() función para formatearlo como número de teléfono.

Ejemplo:

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

Resultado:

023-456-7890

El primer argumento es el número de teléfono y el segundo argumento es la cadena de formato. En este ejemplo, estoy usando una cadena de formato personalizado. Puede ajustar la cadena de formato para que se adapte al formato de número de teléfono deseado:

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

Resultado:

(023) 456-7890

Es importante saber qué hacen realmente las cadenas de formato. Cuando use ceros, deberá asegurarse de que el número de teléfono tenga dígitos en todos los lugares donde haya un especificador de formato cero (de lo contrario, podría agregar ceros accidentalmente al número).

También deberá asegurarse de que haya un especificador de formato que coincida con cada dígito (de lo contrario, eliminará los dígitos del número de teléfono).

Otra forma de expresar la cadena de formato es con # especificador de formato. Sin embargo, esto hará que se eliminen los ceros iniciales del número de teléfono.

He aquí un ejemplo para ilustrar lo que quiero decir:

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

Resultado:

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

El FORMAT() La función solo acepta tipos numéricos y valores de fecha y hora. Si el número de teléfono ingresado no es realmente un tipo numérico, entonces probablemente obtendrá un error, algo como esto:

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

Resultado:

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

En tales casos, es bastante fácil convertir el valor a un tipo numérico:

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

Resultado:

023-456-7890

Pero los números de teléfono no deben almacenarse como tipos numéricos de todos modos.

Los valores numéricos se pueden redondear hacia arriba o hacia abajo, realizar cálculos sobre ellos, eliminar automáticamente los ceros insignificantes, etc.

Los números de teléfono son un valor fijo. Cada dígito es significativo (incluidos los ceros iniciales). No queremos que desaparezcan los ceros a menos que lo exijamos explícitamente (para un código de país, por ejemplo). Y no queremos que nuestros números de teléfono se redondeen inadvertidamente hacia arriba o hacia abajo. Y es poco probable que alguna vez necesite realizar cálculos en sus números de teléfono.

Por lo tanto, tiene más sentido almacenar números de teléfono como una cadena. Convertirlos a un tipo numérico antes de formatearlos (como en el ejemplo anterior) aún podría generar cambios inesperados en el número.

Si el número de teléfono ya es una cadena, pruebe el siguiente método.

Números de teléfono almacenados como cadenas

Si el número de teléfono se almacena como una cadena, puede usar STUFF() función para insertar las cadenas apropiadas en el número de teléfono en los lugares relevantes.

Ejemplos:

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

Resultado:

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

El primer argumento es la cadena original (en este caso, el número de teléfono) y el cuarto argumento es la cadena que se va a insertar. El segundo argumento especifica dónde insertar el cuarto argumento.

El tercer argumento especifica cuántos caracteres eliminar de la cadena original (en caso de que desee reemplazar ciertos caracteres con la nueva cadena). En nuestro caso, no queremos eliminar ningún carácter, por lo que usamos 0 .

Dependiendo del formato del número de teléfono original, otra forma de hacerlo es usar REPLACE() función. Un ejemplo de dónde podría ser útil esto es cuando el número de teléfono ya está formateado con un separador, pero debe reemplazarse con otro separador:

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

Resultado:

023-456-7890

Números Internacionales

E.164 es un estándar internacional que define el formato de los números de teléfono internacionales.

Los números E.164 tienen el formato [+][country code][area code][local phone number] y puede tener un máximo de quince dígitos.

Aquí hay un ejemplo que usa dos métodos para concatenar el código de país, el código de área y el número de teléfono:

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

Resultado:

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

El primer método usa CONCAT() y la segunda usa el operador de concatenación (+ ).

Ese ejemplo formatea un número basado en EE. UU. En muchos países, el código de área tiene un cero inicial que debe eliminarse cuando se usa el formato E.164.

Una forma de suprimir los ceros iniciales es convertir el código de área en un valor numérico y viceversa.

Aquí hay un ejemplo del uso de esa técnica en un número basado en el Reino Unido:

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

Resultado:

+442034567890

En este caso, se eliminó el cero inicial.

Este es el mismo código que se compara con el número anterior basado en EE. UU. (que no usa un cero inicial en el código de país):

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

Resultado:

+14154567890

Esta vez el código de país se mantuvo en tres dígitos.