最近项目要用到省市区地址三级联动。原有的数据是老版本的。
在网上找了找,发现很多,也很杂。最终决定自己整理一份,就当练手了。
看到的数据只有代码和名称两列数据如:
110000北京市
110100市辖区
110101东城区
去空格整理后复制到excel表中供导入数据库
1、首先要把地址分出1、2、3级代表省、市、区。
那么问题来了。原先想依据名称列的缩进来进行区分,但是想想有点复杂,而且容易出错。
后来用地区的编码规律来区分
编码为6个字符组成例如:110101
首先把表结构建起来吧。
从Excel表导入数据吧,这个就不说咯
现在开始了!
如果后4位为"0000"---------------------是省级1
UPDATE[region]SETlevel=1WHERESUBSTRING(code,3,6)='0000'GO如果后2位为"00"和等级level不等于1----------是市级2
UPDATE[Test].[dbo].[region]SET[level]=2WHERESUBSTRING(code,5,6)='00'and([level]<>1ro[level]isnull)GO备注:什么?执行了没效果?先把level字段赋值为0吧。UPDATE[region]SETlevel=0WHERElevelisnullGO其他的-----------------------------------是区级3
UPDATE[region]SETlevel=3WHERElevel=0GO2、现在我们来把父ID整理出来
也是依靠地址编码看代码就懂了啦
省级UPDATE[region]SETparent_id=0WHERElevel=1GO市级UPDATEaSETa.[parent_id]=b.[id]from[region]a,[region]bWHERESUBSTRING(a.[code],1,2)=SUBSTRING(b.[code],1,2)anda.[level]=2andb.[level]=1GO区级UPDATEaSETa.[parent_id]=b.[id]from[region]a,[region]bWHERESUBSTRING(a.[code],1,4)=SUBSTRING(b.[code],1,4)anda.[level]=3andb.[level]=2GO
3、整理地区全称(这个字段有必要整理出来,原因嘛,选择联动地区获得省市区地址名称的时候会有意外的惊喜!例如:北京市市辖区XXX区,北京市县XXX县虽然没错但是影响美观)
直接上代码:
UPDATE[region]SETtext_full=textWHEREid=idandlevel=1GOUPDATEaSETa.text_full=b.text_full+a.textfrom[region]a,[region]bWHEREa.parent_id=b.idanda.[level]=2andb.[level]=1GOUPDATEaSETa.text_full=b.text_full+a.text_fullfrom[region]a,[region]bWHEREa.parent_id=b.idanda.[level]=3andb.[level]=2GO现在好了,看下检查下数据。会发现问题
SELECT*FROM[region]WHERE([level]=2)AND(text='县'ORtext='市辖区'ORtext='省直辖县级行政区划')运行上面一段语句会发现text_full字段很不合理嘛。
北京市市辖区XXX区,北京市县XXX县
要解决这个问题,开启无敌模式,手动改下吧。(好在只有11行数据)
改成如下图
记得重新生成区级的text_full
UPDATEaSETa.text_full=b.text_full+a.text_fullfrom[region]a,[region]bWHEREa.parent_id=b.idanda.[level]=3andb.[level]=2GO