Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Formater un numéro de téléphone dans SQL Server (T-SQL)

Voici quelques exemples de formatage des numéros de téléphone dans SQL Server.

Cela inclut des exemples de formatage des numéros au format E.164 (pour les numéros internationaux), en ajoutant le code de pays et l'indicatif régional, ainsi qu'en omettant le zéro non significatif du code de pays si nécessaire.

Numéros de téléphone numériques

Si le numéro de téléphone est stocké sous forme de valeur numérique (ce qui ne devrait pas être le cas), vous pouvez utiliser le FORMAT() fonction pour le formater en numéro de téléphone.

Exemple :

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

Résultat :

023-456-7890

Le premier argument est le numéro de téléphone et le deuxième argument est la chaîne de format. Dans cet exemple, j'utilise une chaîne de format personnalisée. Vous pouvez ajuster la chaîne de format en fonction du format de numéro de téléphone souhaité :

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

Résultat :

(023) 456-7890

Il est important de savoir ce que font réellement les chaînes de format. Lorsque vous utilisez des zéros, vous devez vous assurer que le numéro de téléphone contient réellement des chiffres à chaque endroit où il y a un spécificateur de format zéro (sinon vous pourriez accidentellement ajouter des zéros au numéro).

Vous devrez également vous assurer qu'il existe un spécificateur de format correspondant à chaque chiffre (sinon, vous supprimerez des chiffres du numéro de téléphone).

Une autre façon d'exprimer la chaîne de format est avec le # spécificateur de format. Cependant, cela entraînera la suppression de tous les zéros non significatifs du numéro de téléphone.

Voici un exemple pour illustrer ce que je veux dire :

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

Résultat :

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

Le FORMAT() La fonction accepte uniquement les types numériques et les valeurs datetime. Si le numéro de téléphone saisi n'est pas réellement un type numérique, vous obtiendrez probablement une erreur, quelque chose comme ceci :

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

Résultat :

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

Dans de tels cas, il est assez facile de convertir la valeur en un type numérique :

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

Résultat :

023-456-7890

Mais les numéros de téléphone ne doivent de toute façon pas être stockés sous forme de types numériques.

Les valeurs numériques peuvent être arrondies vers le haut ou vers le bas, des calculs peuvent être effectués dessus, les zéros non significatifs peuvent être automatiquement supprimés, etc.

Les numéros de téléphone sont une valeur fixe. Chaque chiffre est significatif (y compris les zéros non significatifs). Nous ne voulons pas que les zéros non significatifs disparaissent, sauf si nous l'exigeons explicitement (pour un code de pays par exemple). Et nous ne voulons pas que nos numéros de téléphone soient arrondis par inadvertance vers le haut ou vers le bas. Et il est peu probable que vous ayez besoin d'effectuer des calculs sur vos numéros de téléphone.

Il est donc plus logique de stocker les numéros de téléphone sous forme de chaîne. Les convertir en un type numérique avant de les formater (comme dans l'exemple ci-dessus) peut toujours entraîner des modifications inattendues du nombre.

Si le numéro de téléphone est déjà une chaîne, essayez la méthode suivante.

Numéros de téléphone stockés sous forme de chaînes

Si le numéro de téléphone est stocké sous forme de chaîne, vous pouvez utiliser le STUFF() fonction pour insérer les chaînes appropriées dans le numéro de téléphone aux endroits pertinents.

Exemples :

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

Résultat :

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

Le premier argument est la chaîne d'origine (dans ce cas, le numéro de téléphone) et le quatrième argument est la chaîne à insérer. Le deuxième argument spécifie où insérer le quatrième argument.

Le troisième argument spécifie le nombre de caractères à supprimer de la chaîne d'origine (au cas où vous voudriez remplacer certains caractères par la nouvelle chaîne). Dans notre cas, nous ne voulons supprimer aucun caractère, nous utilisons donc 0 .

Selon le format du numéro de téléphone d'origine, une autre façon de procéder consiste à utiliser le REPLACE() une fonction. Un exemple où cela peut être utile est lorsque le numéro de téléphone est déjà formaté avec un séparateur, mais qu'il doit être remplacé par un autre séparateur :

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

Résultat :

023-456-7890

Numéros internationaux

E.164 est une norme internationale qui définit le format des numéros de téléphone internationaux.

Les numéros E.164 sont au format [+][country code][area code][local phone number] et peut avoir un maximum de quinze chiffres.

Voici un exemple qui utilise deux méthodes pour concaténer l'indicatif du pays, l'indicatif régional et le numéro de téléphone :

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

Résultat :

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

La première méthode utilise le CONCAT() fonction, et la seconde utilise l'opérateur de concaténation (+ ).

Cet exemple formate un numéro basé aux États-Unis. Dans de nombreux pays, l'indicatif régional a un zéro devant qui doit être supprimé lors de l'utilisation du format E.164.

Une façon de supprimer les zéros non significatifs consiste à convertir l'indicatif régional en une valeur numérique et inversement.

Voici un exemple d'utilisation de cette technique sur un numéro basé au Royaume-Uni :

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

Résultat :

+442034567890

Dans ce cas, le zéro non significatif a été supprimé.

Voici le même code exécuté par rapport au numéro précédent basé aux États-Unis (qui n'utilise pas de zéro non significatif dans le code de pays):

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

Résultat :

+14154567890

Cette fois, le code du pays est resté à trois chiffres.