将一列拆分为3然后插入表中

时间:2016-12-27 19:32:38

标签: sql-server

最近您好我一直试图拆分一个包含[city, state zip]的列 然后只在[city] [state] [zip]的单独列中插入同一个表中。

该列的

格式各不相同:[New York, VA 50000]或类似[New York, West Virginia 50000-0000]。有没有一种简单的方法可以做到这一点我尝试过使用子字符串,但我没有太多运气!

3 个答案:

答案 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