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

Sql server 如何在T-SQL中拆分地址字符串?,sql-server,tsql,string,Sql Server,Tsql,String,我想根据列将一列拆分为4列 例如:列值包括“城市名称”、“州”、“Zipcode”、“国家” 我想把它分成4个不同的列,比如城市名称,州,Zipcode,国家 如何使用T-SQL实现这一点?如果原始列中有一些明显的分隔符,则可以编写用户定义的函数或使用一些内联正则表达式将数据提取到4列中。如何做到这一点取决于: 您的数据,尤其是它的同质性 你的RDMBS 您可能希望让我们查看一些示例数据以获取更多信息。如果您的原始列中有一些明显的分隔符,您可以编写一个用户定义函数或使用一些内联正则表达式将数

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

例如:列值包括“城市名称”、“州”、“Zipcode”、“国家”

我想把它分成4个不同的列,比如
城市名称
Zipcode
国家


如何使用T-SQL实现这一点?

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

  • 您的数据,尤其是它的同质性
  • 你的RDMBS

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

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

  • 您的数据,尤其是它的同质性
  • 你的RDMBS

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

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

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


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

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


步骤3:删除旧列

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

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

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

输出

City_Name   State   Zipcode Country
New York City   NJ  10028   United States

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

输出

City_Name   State   Zipcode Country
New York City   NJ  10028   United States

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

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' )

要在查询中使用,请参阅关于使用APPLY的

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

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' )

有关在查询中的使用,请参见关于使用APPLY的

您使用的是哪个版本的SQL Server?另外,请使用更具描述性的标题:“如何在T-SQL中拆分地址字符串?”请提供源列的示例。准确的格式很重要。感谢您的回复…我使用的是SQL Server 2005…源列名是Details,值是'Delhi,Delhi,34567,IND',现在o/p应该看起来像City_Name State Zipcode Country------------------------------Delhi Delhi 34567 IND您使用的是什么版本的SQL Server?另外,请使用更具描述性的标题:“如何在T-SQL中拆分地址字符串?”请提供源列的示例。准确的格式很重要。感谢您的回复…我使用的是SQL Server 2005…源列名是Details,值是'Delhi,Delhi,34567,现在o/p应该看起来像City_Name State Zipcode Country--------------------德里34567 IND感谢您的回复…因为我同时使用了子字符串和CHARIINDEX,但我能够将其拆分为两列正在工作的示例查询看起来像SELECT子字符串(CITY,1,CHARINDEX(',',CITY))作为表_NAME中的CITY_NAME,这将作为唯一的城市名称提供..我需要其他列的名称,还要提前感谢Hanks的回复…因为我同时使用了SUBSTRING和CHARINDEX,但我能够将其拆分为两列正在工作的示例查询类似于SELECT SUBSTRING(CITY,1,CHARINDEX(‘,’,CITY))作为城市名称,来自表中的城市名称,这将作为唯一的城市名称提供。我需要其他Column也提前感谢非常感谢…这对我真的很有帮助非常非常感谢…这对我真的很有帮助