2009-04-27 1 views
1

주문하려면 영국 우편 번호 목록을 정렬해야합니다.메뉴 /리스트 용 우편 번호 정렬

간단한 방법이 있나요?

이 형식의 전체 정보를 원하시면 다음을 참조하십시오 :

영국의 우편 번호는 문자와 숫자로 구성되어 있습니다 http://en.wikipedia.org/wiki/UK_postcodes

하지만 내 문제는 각각의 코드로 시작하기 때문에이 간단한 알파 정렬이 작동하지 않는 것입니다 1 또는 2 글자 글자를 입력 한 다음 즉시 숫자 2 자리까지 입력 한 다음 다른 숫자와 글자를 입력하십시오. 예 :

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

I : LS1의 1AA 또는 ls28의 1AA 또한 제 섹션 번호 일단 99 그럼

알파 정렬 10S 즉시 하나를 수행하게 9A 등 계속 초과 다른 경우가있다 인쇄 가능한 우편 번호를 정렬 가능한 우편 번호로 변환하는 SQL 함수를 만드는 방법을 찾고 있습니다. 'LS1 9ZZ'는 'LS01 9ZZ'가되고, order by 절에서이 함수를 사용합니다.

아무도 이미이 비슷한 작업을 했습니까?

+0

목록을 매우 짧게 유지할 수 없다면 (아마도) 사용자가 선택할 수있는 엽서 목록 또는 메뉴가 다소 불쾌한 UI라고 생각합니다. 그리고 알파 정렬은 실제로 이렇게해야 할 필요가있는 것만 큼 좋을 수도 있습니다. 내 작업 포스트 코드가 패턴에 맞지 않습니다. 그것은 ec1a 2ay입니다. 어디에서 정렬 목록에 넣으시겠습니까? –

+0

동의 - UI 방법이 변경됩니다. – Adrian

답변

4

당신은 토큰의 문제로 생각해야합니다 원할 경우 안쪽 부분을 1과 AA로 나눕니다.)

(210)

및 G12 8QT는에 토큰 화해야합니다

  • G
  • 12
  • (빈 문자열)
  • 8QT

당신이 그 구성 요소 부분으로 우편 분류하면 다음 정렬 충분히 쉬워야한다. 거기 GIR 0AA의 우편 번호에 예외가 있지만, 당신은 단지 하나

편집에 대한 테스트 하드 코딩 할 수 있습니다 샘플 우편 번호 SW1A의 1AA에 대한 토큰 화

에 좀 더 생각을, SW는 우편 번호 지역, 1A이다 우편 번호 구역 (정렬을 위해 두 부분으로 나누어 짐), 1은 우편 번호 구역이고 AA는 단위 우편 번호입니다.

은 유효한 우편 번호 형식입니다 (출처 : 로얄 메일 PAF의 사용자 설명서 8 페이지 - this page의 하단에 링크) :

NAA
AAN NAA
ANN NAA
ANA NAA
AAA NAA (단 GIR 0AA 코드)
AANN NAA
아나 NAA

그래서 거친 알고리즘 (우리가 원하는 가정 할 것이다에 자체 섹터 및 단위 우편 번호를 parate) :

  • code = GIR 0AA? GI/R// 0/AA로 토큰 화하십시오 (지구를 R로 처리하면 사물을 단순화 함)
  • 코드 길이가 5 글자 (예 : G1 3AF? G/1// 3/AF로 토큰 화
  • 코드는 3 자이고 문자는 3 자이며 예 : W1P 1HQ? W/1/P/1/HQ로 토큰 화
  • 코드 6 자이고 두 번째 문자는 영문자입니다. CR2 6XH? CR/2// 6/XH로 토큰 화
  • 코드는 7 자이고 네 번째 문자는 영문자입니다. EC1A 1BB? EC/1/A/1/BB로 토큰 화하십시오.
  • 그렇지 않으면 예 : 목적은 내가의 '정렬'버전을 저장 닐 버터 워스의 제안을 채택 할 후 선택할 수있는 사용자에 대한 우편 번호의 목록을 표시하는 경우 TW14 2ZZ는,/14// 2/ZZ

TW에 토큰 화 데이터베이스의 우편 번호. 정렬 가능한 버전을 만드는 가장 쉬운 방법은 패드에 아홉 자 모든 항목입니다 : 지역에 대한

  • 두 개의 문자 (오른쪽 패드 짧은 경우) 지구 번호
  • 이 (왼쪽 패드 짧은 경우) 단위
01 섹터
  • 지구 문자에
  • 하나를 (패드 누락 된 경우)
  • 공백
  • 이고 GIR 0AA는 다시 약간의 예외입니다. 공백으로 채우는 경우 정렬 순서가 정확해야합니다.

    • W1 # 1AA => # W 1 ## 1AA
    • WC1 # 1AA => WC# 1 ## 1AA
    • W10 # 1AA => ## W : 공간을 나타내는 #을 사용하여 실시 예 10 ## 1AA
    • W1W # 1AA => ## 1W #의 1AA
    • GIR # 0AA => GI # 1 R의 ##의 0AA
    • WC10 #의 1AA => WC10 ## 1AA
    • WC1W # 1 1AA W => WC# 1W # 1AA

    너무 짧으면 영역을 오른쪽 패드해야합니다. 왼쪽 패딩을 사용하면 잘못된 정렬 순서가 생성됩니다. 모든 단일 문자 영역 (B, E, G, L, M, N, S, W)은 AB, AL 등 두 글자 영역 앞에 정렬됩니다., ZE - 당신은 왼쪽 패딩 경우

    지구 번호가 자연 W1은 W2는, ..., W9, W10 순서가 그대로 남아 있도록 패딩 남아있을 필요가

  • +0

    'tokenisation'은 일반적인 구분 기호가 없기 때문에 직설적이지는 않지만 .... – Adrian

    +0

    토큰 화에 대한 대략적인 알고리즘과 결과 저장 방법에 대한 아이디어를 추가했습니다. – barrowc

    +0

    감사합니다. - 답변을 표시 할 수 없습니다. 더 이상, 잘하면 누군가 다른 것입니다. – Adrian

    1

    실제 우편 번호와 함께 데이터베이스에 정규화 된 우편 번호를 저장하려고합니다. 문자열 조작을 한 번만 수행하면 인덱스를 사용하여 정렬을 도와 줄 수 있습니다.

    • SW
    • 1
    • 1AA

    (당신은 할 수 있지만 : SW1A 1AA가 토큰 화해야하므로

    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

    으로 분할 그것은 것이다 다음 두 번째 다음에 우편 번호의 첫 부분에 의해 순서.