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.
4 Réponses :
Utilisez comme et pas comme :
where Phone like '%0%0%' and Phone not like '%0%0%0%'
Vous pouvez utiliser replace () et len():
where len(phone) - len(replace(phone, '0', '')) = 2
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.
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;
Si vous souhaitez ignorer l'indicatif régional
where phone like '%)%0%0%' and phone not like '%)%0%0%0%'
(010) 9984510contient trois zéros