0
votes

Comment afficher les numéros de téléphone en SQL contenant deux et seulement deux «0»?

J'essaie d'écrire une requête qui extraira les numéros de téléphone d'une colonne qui sont formatés d'une manière particulière. Ce format me cause des problèmes sur la façon d'extraire les nombres dont j'ai besoin.

Un peu de contexte: j'ai une table appelée Fournisseurs et une colonne appelée Téléphone. Un exemple de numéro de téléphone serait: (010) 9984510. Les indicatifs régionaux sont tous entre parenthèses. Il y a plusieurs numéros de téléphone dans la colonne avec un format similaire. J'ai besoin d'extraire les numéros de téléphone qui contiennent deux ET SEULEMENT deux «0». Voici ce que j'ai essayé:

select SupplierID, Phone
from Suppliers
where Phone like '%0%0%';

SupplierID est juste une colonne avec un numéro d'identification. Le principal problème auquel je suis confronté est de savoir comment extraire ces nombres avec deux et seulement deux «0»? Les parenthèses me font extraire plus de nombres que nécessaire. Je ne pense pas être autorisé à modifier la colonne de quelque manière que ce soit, mais toute solution est la bienvenue.


1 commentaires

(010) 9984510 contient trois zéros


4 Réponses :


3
votes

Utilisez comme et pas comme :

where Phone like '%0%0%' and Phone not like '%0%0%0%'


0 commentaires

3
votes

Vous pouvez utiliser replace () et len():

where len(phone) - len(replace(phone, '0', '')) = 2


2 commentaires

Cela a très bien fonctionné. L'indice que j'avais suggéré d'utiliser deux opérateurs similaires, mais j'ai pu obtenir la quantité correcte de sortie. Merci.


@Chris, c'est bien que vous ayez trouvé une réponse utile. Veuillez envisager d'accepter la réponse en cliquant sur la coche grise à gauche. Il récompense la personne qui a répondu avec quelques points de réputation, et vous en obtenez aussi.



1
votes

Pour les "rires", vous pouvez adopter une approche très différente et compter les 0 caractères:

SELECT YT.*
FROM dbo.YourTable YT
     CROSS APPLY (SELECT COUNT(V.C) AS Zeroes
                  FROM (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15))T(I) --I doubt a phone number will be over 15 characters long
                       CROSS APPLY (VALUES(SUBSTRING(YT.Phone,T.I,1)))V(C)
                  WHERE V.C = '0') Z
WHERE Z.Zeroes = 2;


0 commentaires

0
votes

Si vous souhaitez ignorer l'indicatif régional

where phone like '%)%0%0%' and phone not like '%)%0%0%0%'


0 commentaires