最終整理后的成果圖。

最近項目要用到 省市區 地址三級聯動。 原有的數據是老版本的。
在網上找了找,發現很多,也很雜。最終決定自己整理一份,就當練手了。
代碼源數據以 國家統計局 最新統計數據 http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/201401/t20140116_501070.html
看到的數據 只有 代碼和名稱 兩列數據 如:
110000 北京市
110100 市轄區
110101 東城區
去空格整理后復制到excel 表中 供導入數據庫

1、首先要把地址 分出 1 、2 、3 級 代表 省、市、區 。
那么問題來了。原先想依據名稱列的縮進來 進行區分,但是想想有點復雜,而且容易出錯。
后來用 地區的編碼規律來區分
編碼為 6 個字符組成 例如:110101

首先把表結構建起來吧。

從Excel表導入數據吧,這個就不說咯
現在開始了!
如果 后4位 為"0000" ---------------------是省級 1
UPDATE [region] SET level = 1 WHERE SUBSTRING(code,3,6) = '0000' GO
如果 后2位 為"00" 和 等級 level 不等於1----------是市級 2
UPDATE [Test].[dbo].[region] SET [level] = 2 WHERE SUBSTRING(code,5,6) = '00' and ([level] <> 1 ro [level] is null) GO
備注:什么?執行了沒效果? 先把 level 字段 賦值為 0 吧。
UPDATE [region]
SET level = 0
WHERE level is null
GO
其他的 -----------------------------------是區級 3
UPDATE [region] SET level = 3 WHERE level = 0 GO
2、現在我們來把父ID 整理出來
也是依靠地址編碼 看代碼就懂了啦
省級
UPDATE [region] SET parent_id = 0 WHERE level = 1 GO
市級 UPDATE a SET a.[parent_id] = b.[id] from [region] a,[region] b WHERE SUBSTRING(a.[code],1,2) = SUBSTRING(b.[code],1,2) and a.[level] = 2 and b.[level] = 1 GO
區級 UPDATE a SET a.[parent_id] = b.[id] from [region] a,[region] b WHERE SUBSTRING(a.[code],1,4) = SUBSTRING(b.[code],1,4) and a.[level] = 3 and b.[level] = 2 GO
3、整理地區全稱(這個字段有必要整理出來,原因嘛,選擇聯動地區 獲得省市區地址名稱的時候 會有意外的驚喜!例如:北京市市轄區XXX區,北京市縣XXX縣 雖然沒錯 但是影響美觀)
直接上代碼:
UPDATE [region] SET text_full = text WHERE id = id and level = 1 GO UPDATE a SET a.text_full = b.text_full + a.text from [region] a,[region] b WHERE a.parent_id = b.id and a.[level] = 2 and b.[level] = 1 GO UPDATE a SET a.text_full = b.text_full + a.text_full from [region] a,[region] b WHERE a.parent_id = b.id and a.[level] = 3 and b.[level] = 2 GO
現在好了,看下檢查下數據。會發現問題
SELECT * FROM [region] WHERE ([level] = 2) AND (text = '縣' OR text = '市轄區' OR text = '省直轄縣級行政區划')
運行上面一段語句 會發現 text_full 字段很不合理嘛。
北京市市轄區XXX區,北京市縣XXX縣
要解決這個問題,開啟無敵模式,手動改下吧。(好在只有11行數據)
改成如下圖

記得重新 生成 區級的 text_full
UPDATE a SET a.text_full = b.text_full + a.text_full from [region] a,[region] b WHERE a.parent_id = b.id and a.[level] = 3 and b.[level] = 2 GO
就到這里了。
so easy 吧。
話說怎么傳附件?
