1

英国の郵便番号のリストを順番に並べ替える必要があります。

それを行う簡単な方法はありますか?

英国の郵便番号は、文字と数字で構成されています。

フォーマットの完全な情報については、http: //en.wikipedia.org/wiki/UK_postcodesを参照してください。

しかし、私の問題は、各コードが1文字または2文字の文字で始まり、その直後に最大2桁の数字、次にスペース、別の数字、次に文字が続くため、単純なアルファソートが機能しないことです。LS1 1AA や ls28 1AA のように、最初のセクションの数字が 99 を超えると 9A などと続く場合もあります。

アルファ ソートにより、10 が 1 の直後に続きます。

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

印刷可能な郵便番号をソート可能な郵便番号に変換する SQL 関数の作成を検討しています。たとえば、「LS1 9ZZ」は「LS01 9ZZ」になり、この関数を order by 句で使用します。

誰かがこれまたは同様のことをすでに行っていますか?

4

3 に答える 3

4

これをトークン化の問題と考える必要があるため、SW1A 1AA は次のようにトークン化する必要があります。

  • SW
  • 1
  • 1AA

(必要に応じて、内側の部分を 1 と AA に分割できますが)

G12 8QT は次のようにトークン化する必要があります。

  • G
  • 12
  • (空文字列)
  • 8QT

郵便番号をこれらの構成要素に分解したら、並べ替えは簡単です。GIR 0AA 郵便番号には例外がありますが、そのテストをハードコードすることができます

編集:トークン化に関するいくつかの考え

サンプルの郵便番号 SW1A 1AA の場合、SW は郵便番号の地域、1A は郵便番号の地区 (並べ替えのために 2 つの部分に分けます)、1 は郵便番号のセクター、AA は郵便番号の単位です。

これらは有効な郵便番号形式です (出典: Royal Mail PAF ユーザー ガイド ページ 8 -このページの下部にあるリンク):

AN NAA
AAN NAA
ANN NAA
ANA NAA
AAA NAA (GIR 0AA コードのみ)
AANN NAA
AANA NAA

大まかなアルゴリズムは次のようになります (セクターとユニットの郵便番号を分離したい場合):

  • コード = GIR 0AA? GI/R/ /0/AA にトークン化します (R を地区として扱うと簡単になります)
  • コード 5 文字の長さ、例: G1 3AF? G/1/ /3/AF にトークン化
  • コードは 6 文字の長さで、3 番目の文字は文字です。例: W1P 1HQ? W/1/P/1/HQ にトークン化
  • CR2 6XH? CR/2/ /6/XH にトークン化
  • EC1A 1BB のように、4 番目の文字が文字である 7 文字の長さのコード EC/1/A/1/BB にトークン化
  • それ以外の場合、例: TW14 2ZZ、TW/14/ /2/ZZ にトークン化

ユーザーが選択できるように郵便番号のリストを表示することが目的である場合、データベースに郵便番号の「ソート可能な」バージョンを保存するという Neil Butterworth の提案を採用します。ソート可能なバージョンを作成する最も簡単な方法は、すべてのエントリを 9 文字にパディングすることです。

  • エリアの 2 文字 (短い場合は右パッド)
  • 地区番号は 2 つ (短い場合は左パッド)
  • 地区レター用の 1 つ (欠落している場合はパッド)
  • スペース
  • セクター用の 1 つ
  • ユニットに2つ

また、GIR 0AA はわずかな例外です。スペースでパディングすると、ソート順は正しいはずです。# を使用してスペースを表す例:

  • 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

領域が短すぎる場合は、領域を右にパディングする必要があります。左にパディングすると、間違った並べ替え順序が生成されます。すべての 1 文字領域 (B、E、G、L、M、N、S、W) は、すべての 2 文字領域 (AB、AL、...、ZE) の前にソートされます。

自然な W1、W2、...、W9、W10 の順序が損なわれないように、地区番号をパディングしたままにする必要があります。

于 2009-04-27T11:53:59.883 に答える
2

これが数年遅れていることは知っていますが、私もこの問題を経験したばかりです。私は次のコードでそれを克服することができたので、インターネットを検索して何も見つからなかったので共有したいと思いました!

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

このコードは、完全な英国の郵便番号を 2 つに分割します。

次に、郵便番号の最初の部分に続いて 2 番目の部分で並べ替えます。

于 2012-09-23T20:56:36.633 に答える
1

正規化された郵便番号を実際の郵便番号と一緒にデータベースに保存したいと思います。これにより、文字列操作を 1 回だけ行うことができ、インデックスを使用して並べ替えを行うことができます。

于 2009-04-27T09:14:57.597 に答える