重新格式化单个杂乱的列

时间:2015-01-08 13:03:53

标签: sql sql-server regex sql-server-2012 format

我有一个非常有趣的数据集,由同事提供给我。数据集位于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'

任何人都知道我可以从哪里开始?

感谢。

1 个答案:

答案 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;列。