2014-11-18 5 views
0

기본적으로 거리 주소 (예 : 321 North Laredo Road)의 열이 있습니다. 이 열은 10,000 개 이상의 레코드가 있습니다. 일부 레코드는 완전히 생략되지 않은 일부 레코드와 일부는 완전히 레코드입니다. 일관성이 없다는 점을 지적하십시오 (액세스하기 전에는 이와 같았습니다). 나는 모든 주소의 Directionals (N, S, E, W)와 거리 이름 (도로, blvd, ave 등)을 축약 된 양식으로 만들고 두 번째 열을 추가해야합니다. 방법론을 통한 제안 또는 이미 작성된 솔루션. 다음 테스트 코드와 혼합 된 결과를 얻습니다. . .문자열 대체 - 단축 약어

/* First find/update directionals */ 
UPDATE hospital 
set tiger_address = replace(street, 'North', 'N') 
where street LIKE "%North%" 
; 
UPDATE hospital 
set tiger_address = replace(street, 'South', 'S') 
where street LIKE "%South%" 
; 
UPDATE hospital 
set tiger_address = replace(street, 'East', 'E') 
where street LIKE "%East%" 
; 
UPDATE hospital 
set tiger_address = replace(street, 'West', 'W') 
where street LIKE "%West%" 
; 
/* Second look for streets to abbreviate */  
UPDATE hospital 
set tiger_address = replace(tiger_address, 'Alley', 'Aly') 
where tiger_address LIKE "%Alley%" 
; 
UPDATE hospital 
set tiger_address = replace(tiger_address, 'Anex', 'Anx') 
where tiger_address LIKE "%Anex%" 
; 
UPDATE hospital 
set tiger_address = replace(tiger_address, 'Arcade', 'Arc') 
where tiger_address LIKE "%Arcade%" 
; 
UPDATE hospital 
set tiger_address = replace(tiger_address, 'Avenue', 'Ave') 
where tiger_address LIKE "%Avenue%" 
; 
UPDATE hospital 
set tiger_address = replace(tiger_address, 'Bayou', 'Byu') 
where tiger_address LIKE "%Bayou%" 
; 
UPDATE hospital 
set tiger_address = replace(tiger_address, 'Beach', 'Bch') 
where tiger_address LIKE "%Beach%" 
; 
UPDATE hospital 
set tiger_address = replace(tiger_address, 'Bend', 'Bnd') 
where tiger_address LIKE "%Bend%" 
; 
UPDATE hospital 
set tiger_address = replace(tiger_address, 'Bluff', 'Blf') 
where tiger_address LIKE "%Bluff%" 
; 
UPDATE hospital 
set tiger_address = replace(tiger_address, 'Bluff', 'Blfs') 
where tiger_address LIKE "%Bluffs%" 
; 
UPDATE hospital 
set tiger_address = replace(tiger_address, 'Street', 'St') 
where tiger_address LIKE "%street%" 
; 

UPDATE hospital 
set tiger_address = replace(street, 'Road', 'Rd') 
where tiger_address LIKE "%road%" 
; 
UPDATE hospital 
set tiger_address = replace(tiger_address, 'Drive', 'Dr') 
where tiger_address LIKE "drive%" 
; 
UPDATE hospital 
set tiger_address = replace(tiger_address, 'Boulevard', 'Blvd') 
where tiger_address LIKE "boulevard%" 
; 

더 좋은 방법이 있어야합니다. 당신은

답변

0

사용하여 수행 할 수있는 단어 중 하나 개의 덩어리를 삭제 감사 MariaDB의 regexp_replacepositive look-ahead and look-behind assertions. 베 이유와 불 바드의 경우 나는 replace을 사용합니다.

select replace(replace(
    regexp_replace(
    'North East South West Alley Anex Arcade Avenue ' 
    'Bayou Beach Bend Bluff Bluffs Street Road Drive Boulevard', 

    '(?<=N)orth|(?<=S)outh|(?<=E)ast|(?<=W)est|(?<=Al)le(?=y)|' 
    '(?<=An)e(?=x)|(?<=Arc)ade|(?<=Ave)nue|(?<=B)ea(?=ch)|(?<=B)e(?=nd)|' 
    '(?<=Bl)uf(?=f)|(?<=St)reet|(?<=R)oa(?=d)|(?<=Dr)ive', 

    ''), 
    'Bayou', 'Byu'), 
    'Boulevard', 'Blvd')