2010-06-25 2 views
2

Est-il possible d'écrire une condition WHERE dans MS SQL Server qui va récupérer les lignes qui:SQL: LIKE où condition spécifiant une lettre suivie d'un nombre suivi par autre chose?

  • commencent par une lettre spécifiée
  • ont alors une décimale
  • alors rien d'autre

J'ai essentiellement une table qui contient des codes postaux et je veux tous les codes postaux qui appartiennent à Birmingham - B suivi d'un certain nombre. Certains codes postaux sont là qui commencent par B puis une autre lettre qui n'appartient pas à Birmingham, donc je ne peux pas simplement utiliser LIKE 'B%'.

Merci!

Répondre

8

Utilisez LIKE 'B [0-9]%'. Le "[0-9]" indique n'importe quel caractère dans la gamme "0" - "9". Gardez à l'esprit que (a) quelqu'un aura tapé un "O" au lieu d'un "0" dans certains cas, et qu'il peut y avoir des codes postaux internationaux qui commencent aussi par B et un numéro, donc si vous avez un champ pays fiable, vous devriez vérifier cela aussi :) Oui, je travaille avec beaucoup :) codes postaux

+1

Birmingham, comme la plupart des régions, n'a pas de district '0', donc 'B [1-9]%' serait plus précis (si c'est un peu pédant). http://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom –

+0

@Mike Fair point! Bien que je remarque dans la base de données que j'ai à portée de main, il y aurait quatre adresses "B0 ..." à Birmingham, où je suppose que les utilisateurs voulaient taper "B1 ...", donc il faudra ajuster les niveaux de pédanterie selon –

+2

En utilisant les données contenues dans les fichiers Open Codepoint de l'Ordnance Survey, vous pouvez vérifier si le code postal existait réellement plutôt que de simplement valider le formatage. –

0

Je pense que vous pouvez faire quelque chose comme ceci:

Select * From PostCodes 
Where PostCode Like 'B[0-9]%' 
+0

un B, suivi de n'importe quel groupe de caractères, suivi d'un nombre, suivi par n'importe quel groupe de caractères, donc je pense qu'il va correspondre, par exemple, "BS1 6DF", un code postal de Bristol, ainsi que les codes postaux de Birmingham. –

+0

@Matt - Dès que j'ai posté j'ai remarqué un% voyou là-dedans, donc j'ai modifié ma réponse tout de suite. Bravo – codingbadger

-1
SELECT postc FROM postcodes WHERE postc LIKE 'B[0-9]*%'; 

Quelque chose dans ce sens!

Vous pouvez également faire:

SELECT 
    postc as ps,UPPER(SUBSTR(ps),1,1) as firstLetter,SUBSTR(ps,2,1) as secondNumber 
FROM 
    postcodes 
WHERE 
    firstLetter = 'B' AND secondNumber LIKE '[0-9]%' 

Quelque chose le long des lignes eux.

+0

-1 SQL ne fonctionne pas comme ça. Votre prédicat LIKE semble contenir deux caractères génériques. Le nom de corrélation de colonne 'firstletter' dans la clause' SELECT' ne peut pas être utilisé dans la clause 'WHERE'. – onedaywhen

0

MySQL a des expressions régulières (REGEXP/RLIKE) intégrées. Je pense que vous pouvez ajouter la fonctionnalité à d'autres, telles que SQL Server.

Ceci vous donnerait plus de précision, par ex.

SELECT * FROM PostCodes WHERE PostCode RLIKE '^B[[:digit:]]{1,2}[:space:]' 

Cela permettrait également de mieux faire correspondre les éventuelles fautes de frappe dans la condition.

2

Selon l'article de Wikipédia sur la B postcode area:

  • B39 est invalide
  • B95 est Henley-in-Arden,
    Stratford-on-Avon - auriez-vous
    considérer Henley-in -Arden à "appartiennent
    à Birmingham"? (Peut-être il est, je ne sais vraiment pas)

Peut-être le plus sûr pour étendre les codes que vous considérez comme Birmingham:

postcode LIKE 'B1 %' 
OR postcode LIKE 'B2 %' 
OR postcode LIKE 'B3 %' 
... 
OR postcode LIKE 'B10 %' 
OR postcode LIKE 'B11 %' 
OR postcode LIKE 'B12 %' 
... 

Ces préfixes pourraient naturellement être stockés dans une table.

Questions connexes