2015-01-08 18 views
0

我有一個非常有趣的數據集,是由一位同事提供給我的。數據集在SQL Server 2014中。我在那裏有一個名爲'用戶'的表格,列名爲Address。地址的格式是一個爛攤子:重新格式化單個雜亂的列

|Address | |-------------------------------------------------|----------------------- |9, Layman drive, Paris, 32432 | |Layman drive, Paris, 9832, #AALM,43 | |Layman drive, Paris, 33, #AM,1 | |11, Layman drive, Paris | |12, Layman drive, Paris | |-------------------------------------------------|-----------------------

我試圖重新安排所有按以下格式的地址項目:

[地址編號],[街],[市],[郵編]

9,外行車道,巴黎,32432

同時我需要擺脫人物像這個:'#AALM,43'

任何人都知道我可以從哪裏開始?

謝謝。

+0

我會用像C#而不是SQL的其他工具清理它。但即使如此,還不清楚是否有可能。這真是一團糟。似乎沒有任何規則。 –

+0

我總是喜歡在修復過去之前修復未來。在這種情況下,請採取措施確保新記錄具有所需的格式。事實上,我會去分開的領域。此外,您所需的格式不考慮公寓號碼。 –

+1

這看起來像一個正則表達式的工作。 – eebbesen

回答

2

在過去完成像這樣的清理工作之後,您肯定希望分塊執行某些操作,特別是直接從SQL執行操作,例如通過SQL查詢界面。

我會先修改您的表格結構並添加您需要的額外列 - 另外添加到「workingAddress」的EXTRA列(或在您的查詢中縮寫爲「wadr」)。

然後,所有的地址列值複製到臨時工作地址欄,所以我們不破壞原來的一個...

update yourTable set wadr = Address; 

然後,工作一種成分的時間和這樣做...

update yourTable 
    set [Address Number] = LTRIM(RTRIM(LEFT(wadr, CHARINDEX(',', wadr) -1))) 
    where CHARINDEX(',', wadr) > 1; 

然後,只保留那些地址數的只是數字表示

update yourTable 
    set [Address Number] = '' 
    where LTRIM(RTRIM(STR(cast([Address Number] as Integer), 6))) = RTRIM([Address Number]); 
現在210

,對於那些都成功控制,

update yourTable 
    set wadr = LTRIM(RTRIM(SUBSTR(wadr, CHARINDEX(',', wadr) +1, 60))) 
    where LEN(RTRIM([Address Number])) > 0; 

所以現在從工作地址欄去掉,你的地址號碼(如果存在)會在你的[地址編號]列,這個數字已被剝奪從「WADR」欄,並修剪成僅一街之...現在,過程街道:

update yourTable 
    set [Street] = LTRIM(RTRIM(LEFT(wadr, CHARINDEX(',', wadr) -1))) 
    where CHARINDEX(',', wadr) > 1; 

而且從工作地址欄剝離街道

update yourTable 
    set wadr = LTRIM(RTRIM(SUBSTR(wadr, CHARINDEX(',', wadr) +1, 60))) 
    where LEN(RTRIM([Street])) > 0; 

現在到城市,然後剝離市地方發現...

update yourTable 
    set [City] = LTRIM(RTRIM(LEFT(wadr, CHARINDEX(',', wadr) -1))) 
    where CHARINDEX(',', wadr) > 1; 

而且從工作地址欄

update yourTable 
    set wadr = LTRIM(RTRIM(SUBSTR(wadr, CHARINDEX(',', wadr) +1, 60))) 
    where LEN(RTRIM([City])) > 0; 

最後你的郵政編碼......這可能剝離街道是2個條件...如果沒有逗號,只需抓住可能留下的任何東西......您的一些示例數據沒有郵政編碼。這將首先從wadr獲取郵政編碼,然後清除wadr列,如果沒有更多的逗號。

update yourTable 
    set [Postcode] = wadr, 
     wadr = '' 
    where CHARINDEX(',', wadr) < 1; 

現在,對於那些有一個郵政編碼和其他的東西(你的垃圾末),只要抓住之前的逗號像早期的情況下

update yourTable 
    set [Postcode] = LTRIM(RTRIM(LEFT(wadr, CHARINDEX(',', wadr) -1))) 
    where CHARINDEX(',', wadr) > 1; 

update yourTable 
    set wadr = LTRIM(RTRIM(SUBSTR(wadr, CHARINDEX(',', wadr) +1, 60))) 
    where LEN(RTRIM([Postcode])) > 0; 

在年底無論是,你的「wadr」列應該是空白的,或者只是最後的垃圾內容。語法可能需要調整一些,但應該做的伎倆......一旦這些都很好去,確認事情看起來不錯,你可以刪除「wadr」列,如果你想,最終殺死「地址」柱。

+0

爲此付出了很多努力(要麼OP會使用它,要麼拿一些東西從它)+ 1 – HaveNoDisplayName

+0

@Piyush,是的,但在過去做清洗,並沒有破壞原始值,你仍然需要做某種解析/分裂......如果不是做regEx或寫一個完整的C#應用​​程序轉換和更新,這將是一次性清理並丟棄。 – DRapp

+0

同意你的意見! @DRapp – HaveNoDisplayName