如何在T-SQL中拆分地址字符串?

时间:2009-06-26 16:42:42

标签: sql-server tsql string

我想根据列将列拆分为4列。

例如:列值包括'City_Name','State',Zipcode','Country'

我想将其拆分为4个不同的列,例如City_NameStateZipcodeCountry

如何使用T-SQL执行此操作?

5 个答案:

答案 0 :(得分:7)

假设您在该列中始终有3个逗号,则可以使用PARSENAME函数

create table #test(Col varchar(100))
insert #test values('City_Name,State,Zipcode,Country')
insert #test values('New York City,NJ,10028,United States')


select parsename(replace(Col,',','.'),4) as City_Name,
parsename(replace(Col,',','.'),3) as State,
parsename(replace(Col,',','.'),2) as Zipcode,
parsename(replace(Col,',','.'),1) as Country
from #test

输出

City_Name   State   Zipcode Country
New York City   NJ  10028   United States

答案 1 :(得分:0)

如果原始列中有一些明显的分隔符,则可以编写用户定义的函数,也可以使用某些内联正则表达式将数据提取到4列。你如何做到这一点取决于:

  • 您的数据,尤其是它的多样性
  • 你的RDMBS

您可能希望让我们查看一些示例数据以获取更多信息。

答案 2 :(得分:0)

第1步:在数据库表中创建四个新列。由于您要向现有表添加新列,因此它们必须具有默认值(例如,空字符串)

第2步:运行更新查询,根据旧列更新四个新列。使用SQL字符串函数执行此操作(可以在引用中查找它们,例如SUBSTRING

第3步:删除旧列

答案 3 :(得分:0)

创建一个包含所需字段的新表。遍历原始表中的记录,并用分隔符拆分该列中的值。对于拆分,您可以使用charindex,substring和其他字符串操作函数。您可以在SP或函数中编写此逻辑。

答案 4 :(得分:0)

使用您的示例字符串进行测试:

CREATE FUNCTION fn_PARM (@Parm nvarchar(2000))
RETURNS @TParm TABLE (City_Name nvarchar(100),State nvarchar(100),Zipcode nvarchar(100),Country nvarchar(100)) 
AS  
BEGIN 

DECLARE @City_Name nvarchar(100)
    ,@State nvarchar(100)
    ,@Zipcode nvarchar(100)
    ,@Country nvarchar(100)
    ,@CommaPosition1 tinyint
    ,@CommaPosition2 tinyint

    SELECT @CommaPosition1 = charindex(',',@Parm)
    IF (@CommaPosition1>0) 
    BEGIN
        SELECT @City_Name = ltrim(rtrim(SUBSTRING(@Parm,1,@CommaPosition1 - 1)))
        SELECT @CommaPosition2 = @CommaPosition1 + 1

        SELECT @CommaPosition1 = charindex(',',@Parm,@CommaPosition2)
        IF (@CommaPosition1>0) 
        BEGIN
            SELECT @State = ltrim(rtrim(SUBSTRING(@Parm,@CommaPosition2 + 1,@CommaPosition1 - (@CommaPosition2 + 1))))
            SELECT @CommaPosition2 = @CommaPosition1 + 1

            SELECT @CommaPosition1 = charindex(',',@Parm,@CommaPosition2)
            IF (@CommaPosition1>0) 
            BEGIN
                SELECT @Zipcode = ltrim(rtrim(SUBSTRING(@Parm,@CommaPosition2 + 1,@CommaPosition1 - (@CommaPosition2 + 1))))
                SELECT @Country = ltrim(rtrim(SUBSTRING(@Parm,@CommaPosition1 + 1,LEN(@Parm))))
            END
        END
    END

    INSERT INTO @TParm (City_Name, State, Zipcode,Country) 
        VALUES (@City_Name, @State, @Zipcode, @Country)

    RETURN 
END 
GO

简单用法:

select * from fn_PARM('Delhi , Delhi ,34567 ,IND' )

要在查询中使用,请参阅 This MSDN article ,了解如何使用APPLY。