2016-12-27 20 views
1

你好最近我一直試圖分裂含有[city, state zip] 一列,然後只在單獨的列是[city][state][zip]插入到相同的表。分裂一列到3,然後插入到表

列的格式各不相同:[New York, VA 50000]或者它可能類似[New York, West Virginia 50000-0000]。有沒有一種簡單的方法來做到這一點我嘗試過使用子字符串,但我沒有太多的運氣!

+0

留到第一','扭轉串,留到第一空間(反向結果),這將使你的城市和郵政編碼,然後用一個替換功能兩次消除城市,拉鍊修剪結果,你有你的狀態。雖然我敢打賭,有人可以提出一個更快的正則表達式。我只是不熟練他們。 – xQbert

回答

0

您可以使用PARSENAME ...

declare @a varchar(100) = 'New York, VA 50000' 

select parsename(replace(@a,', ','.'), 2) as [State], parsename(replace(parsename(replace(@a,', ','.'), 1),' ','.'), 1) as ZipCode, parsename(replace(parsename(replace(@a,', ','.'), 1),' ','.'), 2) as City 
+0

我喜歡這個想法,我只是不確定在狀態和郵政編碼之間看到一個逗號,並且用空格替換所有空格,對於這些多名城市無效。或州。不幸的是我不能讓SQL小提琴與SQL服務器或Id一起測試我的顧慮。 – xQbert

+0

否則我們需要使用拆分使用http://stackoverflow.com/questions/10581772/how-to-split-a-comma-separated-value-to-columns/39376747#39376747然後添加到不同的列 –

0

這將是一個有點困難,如果你的「國家」的名稱並非全是2個字母的縮寫。我會嘗試對這些值首先執行REPLACE()以將它們全部歸一化,然後開始分離出這些值。

爲了讓那些只有5位數郵政編碼多久,你可以使用:

substring(fieldname,len(rtrim(fieldname))-5,5) ... WHERE substring(ZipCode,len(rtrim(zipcode))-5,1)!='-' 

然後修改它有一個破折號和另外4位的:

substring(ZipCode,len(rtrim(ZipCode))-10,10) ... WHERE substring(ZipCode,len(rtrim(zipcode))-5,1)='-' 

你可以在將它們設置爲相同長度後,使用相同的SUBSTRING()來獲取狀態。提供的,它很混亂,但它會完成工作。

0

我嘗試如下解決您的要求:

DECLARE @LOCATION TABLE (LOCATION VARCHAR(200)) 
DECLARE @NEW_LOCATION TABLE (CITY VARCHAR(200),STATE VARCHAR(200),ZIP VARCHAR(200)) 

INSERT INTO @LOCATION VALUES('[New York, VA 50000]') 
INSERT INTO @LOCATION VALUES('[New York, West Virginia 50000-0000]') 

INSERT INTO @NEW_LOCATION 
SELECT REPLACE(SUBSTRING(LOCATION,0,CHARINDEX(',',LOCATION)),'[',''), 
     REPLACE(REPLACE(LOCATION,SUBSTRING(LOCATION,0,CHARINDEX(',',LOCATION)+1),''), 
       REVERSE(SUBSTRING(REVERSE(LOCATION),0,CHARINDEX(' ',REVERSE(LOCATION)))),''), 
     REPLACE(REVERSE(SUBSTRING(REVERSE(LOCATION),0,CHARINDEX(' ',REVERSE(LOCATION)))),']','') 
     FROM @LOCATION 

SELECT * FROM @NEW_LOCATION