最近您好我一直试图拆分一个包含[city, state zip]
的列
然后只在[city]
[state]
[zip]
的单独列中插入同一个表中。
格式各不相同:[New York, VA 50000]
或类似[New York, West Virginia 50000-0000]
。有没有一种简单的方法可以做到这一点我尝试过使用子字符串,但我没有太多运气!
答案 0 :(得分: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
答案 1 :(得分:0)
如果你的"状态"那将会有点困难。名称不是全部用双字母缩写。我会首先尝试对这些值执行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()来获取状态。虽然它很乱,但它会完成工作。
答案 2 :(得分: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