我有一个非常有趣的数据集,由同事提供给我。数据集位于SQL Server 2014中。我在其中有一个名为“Users”的表,其列名为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,Layman Drive,Paris,32432
与此同时,我需要摆脱这样的角色:'#AALM,43'
任何人都知道我可以从哪里开始?
感谢。
答案 0 :(得分:2)
过去做过像这样的清理工作,你肯定想要分成几部分,特别是直接从SQL中完成,比如通过SQL查询界面。
我首先要修改你的表格结构并添加你想要的其他列 - 添加到EXTRA列中,用于" workingAddress" (或缩写为" wadr"在查询中简要说明。)
然后,将您的所有地址列值复制到临时工作地址列,这样我们就不会销毁您的原始地址...
update yourTable set wadr = Address;
然后,一次处理一个列组件并执行LIKE ...
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]);
现在,对于那些成功的KEPT,从工作地址栏中删除
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;
最后你的邮政编码...这可能是两个条件...如果没有剩余的逗号只是抓住任何可能留下的......你的一些样本数据没有邮政编码。这将首先从wadr获取post代码,然后在没有逗号的情况下清除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;
最后,你的&#34; wadr&#34;列应该是空白的,或者最后只有垃圾内容。语法可能需要调整一些,但应该做的诀窍......一旦这些都很好,确认事情看起来很好,你可以删除&#34; wadr&#34;列,如果你想,最终杀掉&#34;地址&#34;列。