Question

Je dois trier une liste de codes postaux du Royaume-Uni dans l'ordre.

Y at-il un moyen simple de le faire?

Royaume-Uni les codes postaux sont composés de lettres et de chiffres:

voir pour info complète du format: http://en.wikipedia.org/wiki/UK_postcodes

Mais mon problème est une sorte simple alpha ne fonctionne pas parce que chaque code commence par 1 ou deux lettres lettres et est immédiatement suivi d'un numéro, jusqu'à deux chiffres, puis un espace puis un autre numéro une lettre. par exemple. LS1 1AA ou LS28 1AA, il y a aussi un autre cas où une fois les numéros dans la première section dépassent 99 il continue 9A etc.

Alpha provoque la sorte 10s suivre immédiatement le 1:

...
LS1 9ZZ
LS10 1AA
...
LS2 

Je cherche à créer une fonction SQL pour convertir le code postal imprimable en un code postal triables par exemple « LS1 9ZZ » deviendrait « LS01 9ZZ », puis utilisez cette fonction dans l'ordre par article.

Quelqu'un at-il fait cela ou quoi que ce soit déjà semblable?

Était-ce utile?

La solution

Vous devez penser à cela comme un problème de tokens si SW1A 1AA devrait tokenizer à:

  • SW
  • 1
  • A
  • 1AA

(bien que vous pourriez casser la partie vers l'intérieur vers le bas dans 1 et AA si vous voulez)

et G12 8QT devrait tokenizer à:

  • G
  • 12
  • (chaîne vide)
  • 8QT

Une fois que vous avez cassé le code postal vers le bas dans ces composants, puis le tri devrait être assez facile. Il y a une exception avec le code postal RGI 0AA mais vous pouvez juste hardcode un test pour que l'on

edit: quelques autres réflexions sur tokenization

Pour l'échantillon NPA SW1A 1AA, SW est la zone de code postal, la figure 1A est la région de code postal (que nous allons faire une pause en deux parties à des fins de tri), 1 est le secteur de code postal et AA est l'unité de code postal.

Ce sont les formats de codes postaux valides (source: Royal Mail page Guide de l'utilisateur PAF 8 - lien en bas de cette page ):

AN NAA
AAN AAN
ANN NAA
ANA NAA
AAA NAA (uniquement pour le code RGI 0AA)
AANN NAA
AANA NAA

Donc un algorithme approximatif serait (en supposant que nous voulons séparer le secteur et l'unité code postal):

  • Code = RGI 0AA? Tokenize à GI / R / / 0 / AA (traitement R comme le quartier simplifie les choses)
  • code à 5 lettres à long G1 3AF? par exemple Tokenize à G / 1 / / 3 / AF
  • code à 6 lettres longue avec 3 caractère étant une lettre par exemple W1P 1HQ? Tokenize à W / 1 / P / 1 / HQ
  • code à 6 lettres longue avec 2 caractère étant une lettre par exemple CR2 6XH? Tokenize à CR / 2 / / 6 / XH
  • Code 7 lettres longue avec 4 caractère étant une lettre par exemple EC1A 1BB? Tokenize à EC / 1 / A / 1 / BB
  • autrement, par exemple TW14 2ZZ, tokenize à TW / 14 / / 2 / ZZ

Si le but est d'afficher une liste de codes postaux pour l'utilisateur de choisir alors j'adopter la suggestion de Neil Butterworth de stocker une version « sortable » du code postal dans la base de données. La meilleure façon de créer une version triables est de pad toutes les entrées à neuf caractères:

  • deux caractères pour la zone (pad droit si court)
  • deux pour le numéro de district (-pad gauche si court)
  • un pour la lettre du district (pad si manquant)
  • Espace
  • un pour le secteur
  • deux pour l'unité

et RGI 0AA est une légère exception à nouveau. Si vous pad avec des espaces alors l'ordre de tri doit être correct. Exemples d'utilisation # pour représenter un espace:

  • W1 # 1AA => W ## 1 ## 1AA
  • WC1 # 1AA => WC # 1 ## 1AA
  • W10 # 1AA => W # 10 ## 1AA
  • W1W # 1AA => W ## 1W # 1AA
  • RGI # 0AA => GI # R ## 0AA
  • WC10 # 1AA => WC10 ## 1AA
  • WC1W # 1AA => WC # # 1AA 1W

Vous devez-pad droit de la zone si elle est trop courte: padding gauche produit l'ordre de tri tort. Toutes les zones à une lettre - B, E, G, L, M, N, S, W - trierait avant que toutes les zones à deux lettres - AB, AL, ..., ZE - si vous laissiez rembourré

Le numéro de district doit rester rembourré pour faire en sorte que le W1 naturel, W2, ..., W9, W10 ordre reste intact

Autres conseils

Je sais que c'est deux ou trois ans de retard, mais moi aussi je viens de vivre ce problème. J'ai réussi à venir sur avec le code suivant, donc pensé que je partagerais que je cherchai Internet et n'a pas pu trouver quoi que ce soit!

mysql_query("SELECT SUBSTRING_INDEX(postcode,' ',1) as p1, SUBSTRING_INDEX(postcode,' ',-1) as p2 from `table` ORDER BY LENGTH(p1), p1, p2 ASC");

Ce code prendra un code postal complet au Royaume-Uni et scindée en deux.

Il ordonnera alors par la première partie du code postal suivi du second.

Je serais tenté de stocker le code postal normalisé dans la base de données ainsi que le vrai code postal -. De cette façon vous faites une seule fois la manipulation de chaînes, et vous pouvez utiliser un index pour vous aider avec le genre

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top