Domanda

Ho bisogno di ordinare un elenco di codici postali del Regno Unito in ordine.

C'è un modo semplice per farlo?

codici postali del Regno Unito sono costituiti da lettere e numeri:

vedere di piena informazioni del formato: http://en.wikipedia.org/wiki/UK_postcodes

Ma il mio problema è questo un semplice alpha sorta non funziona perché ogni codice inizia con 1 o due lettere lettere e poi è immediatamente seguita da un numero, fino a due cifre, poi uno spazio altro numero poi una lettera. per esempio. LS1 1AA o LS28 1AA, c'è anche un altro caso in cui una volta che i numeri nella prima sezione superano 99 poi prosegue 9A etc.

Alpha sorta causa le 10s a seguire immediatamente l'1:

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

Sto cercando di creare una funzione SQL per convertire il codice postale stampabile in un codice postale ordinabile per esempio 'LS1 9ZZ' diventerebbe 'LS01 9ZZ', quindi utilizzare questa funzione nella clausola ORDER BY.

Qualcuno ha fatto questo o qualcosa di simile già?

È stato utile?

Soluzione

È necessario pensare a questo come un problema di tokenizzazione così SW1A 1AA dovrebbe tokenize a:

  • SW
  • 1
  • A
  • 1AA

(anche se si potrebbe rompere la parte verso l'interno verso il basso in 1 e AA se si voleva)

e G12 8QT dovrebbe tokenize a:

  • G
  • 12
  • (stringa vuota)
  • 8QT

Una volta che avete rotto il codice postale giù in quelle parti che lo compongono, allora l'ordinamento dovrebbe essere abbastanza facile. C'è un'eccezione con il codice postale GIR 0AA, ma si può solo hardcode un test per quella

modifica: alcune riflessioni su più tokenizzazione

Per il campione NPA SW1A 1AA, SW è la zona Cap, 1A è il distretto NPA (che vedremo rompersi in due parti a fini di cernita), 1 è la zona postale e AA è il NPA unità.

Questi sono i formati validi codice postale (fonte: Royal Mail PAF manuale d'uso pagina 8 - link in fondo alle questa pagina ):

AN NAA
AAN NAA
ANN NAA
ANA NAA
AAA NAA (solo per codice GIR 0AA)
AANN NAA
AANA NAA

Quindi, un algoritmo di massima sarebbe (assumendo che vogliamo separare il settore e l'unità di codice postale):

  • code = GIR 0AA? Tokenize di GI / R / / 0 / AA (trattando R come il quartiere semplifica le cose)
  • codice 5 lettere lunga per esempio G1 3AF? Tokenize a G / 1 / / 3 / AF
  • codice di 6 lettere a lungo con 3 ° carattere essendo una lettera per esempio W1P 1HQ? Tokenize a W / 1 / P / 1 / HQ
  • codice di 6 lettere di lunghezza con 2 ° carattere essendo una lettera per esempio CR2 6XH? Tokenize a CR / 2 / / 6 / XH
  • codice di 7 lettere di lunghezza con 4 ° carattere essendo una lettera per esempio EC1A 1BB? Tokenize al CE / 1 / A / 1 / BB
  • altrimenti esempio TW14 2ZZ, tokenize a TW / 14 / / 2 / ZZ

Se lo scopo è quello di visualizzare un elenco di codici postali per l'utente di scegliere quindi vorrei adottare il suggerimento di Neil Butterworth di memorizzare una versione 'ordinabile' del codice postale nel database. Il modo più semplice per creare una versione ordinabile è di pad tutte le entrate alla nove caratteri:

  • due caratteri per l'area (destra-pad se inferiore)
  • due per il numero del distretto (sinistra-pad se inferiore)
  • una per la lettera di quartiere (pad se mancante)
  • spazio
  • una per il settore
  • due per l'unità

e GIR 0AA è di nuovo una piccola eccezione. Se pad con spazi allora l'ordinamento deve essere corretta. Esempi di utilizzo # per rappresentare uno spazio:

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

È necessario destro del pad della zona se è troppo corta: sinistra-padding produce l'ordinamento sbagliato. Tutte le singole aree letter - B, E, G, L, M, N, S, W - sarebbe sorta prima che tutte le aree di due lettere - AB, AL, ..., ZE - se lasciato imbottite

Il numero di distretto ha bisogno di essere lasciato imbottita per garantire che il W1 naturali, W2, ..., W9, W10 ordine rimane intatto

Altri suggerimenti

So che questo è un paio di anni di ritardo, ma anche io ho appena vissuto questo problema. Sono riuscito a venire su con il seguente codice, così ho pensato di condividere come ho cercato su internet e non poteva trovare nulla!

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

Questo codice avrà un codice postale completo del Regno Unito e di dividerlo in 2.

Sarà poi ordine dalla prima parte del NPA seguita dalla seconda.

sarei tentato di memorizzare il codice postale normalizzato nel database insieme con il reale Cap -. In questo modo non solo la manipolazione delle stringhe, una volta, e si può utilizzare un indice per aiutarvi con il tipo

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top