你好最近我一直試圖分裂含有[city, state zip]
一列,然後只在單獨的列是[city]
[state]
[zip]
插入到相同的表。分裂一列到3,然後插入到表
列的格式各不相同:[New York, VA 50000]
或者它可能類似[New York, West Virginia 50000-0000]
。有沒有一種簡單的方法來做到這一點我嘗試過使用子字符串,但我沒有太多的運氣!
你好最近我一直試圖分裂含有[city, state zip]
一列,然後只在單獨的列是[city]
[state]
[zip]
插入到相同的表。分裂一列到3,然後插入到表
列的格式各不相同:[New York, VA 50000]
或者它可能類似[New York, West Virginia 50000-0000]
。有沒有一種簡單的方法來做到這一點我嘗試過使用子字符串,但我沒有太多的運氣!
您可以使用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
我喜歡這個想法,我只是不確定在狀態和郵政編碼之間看到一個逗號,並且用空格替換所有空格,對於這些多名城市無效。或州。不幸的是我不能讓SQL小提琴與SQL服務器或Id一起測試我的顧慮。 – xQbert
否則我們需要使用拆分使用http://stackoverflow.com/questions/10581772/how-to-split-a-comma-separated-value-to-columns/39376747#39376747然後添加到不同的列 –
這將是一個有點困難,如果你的「國家」的名稱並非全是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()來獲取狀態。提供的,它很混亂,但它會完成工作。
我嘗試如下解決您的要求:
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
留到第一','扭轉串,留到第一空間(反向結果),這將使你的城市和郵政編碼,然後用一個替換功能兩次消除城市,拉鍊修剪結果,你有你的狀態。雖然我敢打賭,有人可以提出一個更快的正則表達式。我只是不熟練他們。 – xQbert