【问题标题】:Split Address values into separate columns将地址值拆分为单独的列
【发布时间】:2014-06-23 11:46:26
【问题描述】:

我使用的是 SQL Server 2012,并且我有一个具有以下结构的表

DebCode,DebName,DebBillAdd1,DebBillAdd2,DebBillAdd3

但在我的DebBillAdd1 列中包含债务人的完整地址,如下所示。(DebBillAdd2DebBillAdd3 对于所有记录都是空的)

No170, Madapatha Road, Pillyandala, Sri Lanka
91/1, Canal Road, Hethdala, Wattala.

现在我需要将地址分成 3 部分并在剩余的 DebBillAdd2 和 DebBillAdd3 列中更新它们。

这就是我需要拆分地址的方式。

DebBillAdd1 - No170, Madapatha Road
DebBillAdd2 - Piliyandala
DebBillAdd3 - Sri Lanka

DebBillAdd1 - 91/1, Canel Road
DebBillAdd2 - Hethdala
DebBillAdd3 - Wattala
  • DebBillAdd1 - SUBSTRING() 必须检索第一个字符和前两个逗号之间的字符串。
  • DebBillAdd2 - SUBSTRING() 必须检索下两个逗号之间的字符串
  • DebBillAdd3 - SUBSTRING() 必须检索剩余的字符串。

我正在使用 Visual Foxpro 进行开发。

因为我不知道分裂我无法做到。你们能解释一下如何做到这一点吗?

【问题讨论】:

    标签: sql split sql-server-2012 comma visual-foxpro


    【解决方案1】:

    您可以使用 Foxpro ATC() 和 SUBSTR() 来解析出字符串。

    例如获取地址1:

     lcAddress1 = SUBSTR(DebBillAdd1, 1, ATC(DebBillAdd1, [,], 2)-1)
    

    获取地址2:

     lnEndPos = ATC(DebBillAdd1, [,], 3)   &&Position of third comma
     lnStartPos = ATC(DebBillAdd1, [,], 2) + 1    &&Position of second comma plus 1, could add two to remove space
     lnLength = lnEndPos - lnStartPos       &&Number of characters to get.
     SUBSTR(DebBillAdd1, lnStartPos, lnLength)    &&SUBSTR function with starting position and number of characters to get.
    

    您可以使用 ATC() 和 SUBSTR() 来解析地址 3 的其余字符串。

    然后使用 VFP UPDATE 或 REPLACE 命令更新表的列。

    【讨论】:

      【解决方案2】:

      如果部分总是以相同的方式分隔(即第一个字符到第二个逗号,第二个到第三个逗号,第三个逗号到结尾),请查看此 tsql 代码:

      DECLARE @fullAddress varchar(50),
              @FirstPart varchar(50),
              @SecondPart varchar(50),
              @ThirdPart varchar(50)
      
      SET @fullAddress = 'No170, Madapatha Road, Pillyandala, Sri Lanka' 
      
      DECLARE @SecondCommaLocation int,
              @ThirdCommaLocation int
      
      SELECT  @SecondCommaLocation = CharIndex(',', @FullAddress , CharIndex(',', @FullAddress , 1)+1), -- Get the index of the second comma
              @ThirdCommaLocation = CharIndex(',', @FullAddress , @SecondCommaLocation+1) -- get the index of the third comma
      
      SELECT @FirstPart = SUBSTRING(@FullAddress,1,@SecondCommaLocation-1), -- get the part between the 1st characted and the 2nd comma
             @SecondPart = SUBSTRING(@FullAddress,@SecondCommaLocation+1,@ThirdCommaLocation-@SecondCommaLocation-1), -- get the part between the 2nd and 3rd comma
             @ThirdPart = SUBSTRING(@FullAddress, @ThirdCommaLocation+1, LEN(@FullAddress)-@ThirdCommaLocation+1) -- get tha part after the 3rd comma
      
      SELECT @FirstPart,
             @SecondPart,
             @ThirdPart
      

      【讨论】:

        【解决方案3】:
        SELECT DebCode = 1, DebBillAdd1 = 'No170, Madapatha Road, Pillyandala, Sri Lanka', DebBillAdd2 = null, DebBillAdd3 = null INTO test
        
        DECLARE @c1 int, @c2 int, @c3 int, @len int
        
        UPDATE test 
        SET
        @c1 = CHARINDEX(',', DebBillAdd1, 0)
        ,@c2 = CHARINDEX(',', DebBillAdd1, @c1 + 1)
        ,@c3    = (CHARINDEX(',', DebBillAdd1, @c1 + @c2 + 1) - 1)
        ,@len = LEN(DebBillAdd1)
        
        ,DebBillAdd1 = SUBSTRING(DebBillAdd1, 0, @c2)
        ,DebBillAdd2 = SUBSTRING(DebBillAdd1, @c2 + 1, @c3 - @c2)
        ,DebBillAdd3 = RIGHT(DebBillAdd1, @len - @c3 - 1)
        
        FROM        test
        

        【讨论】:

          【解决方案4】:

          如果您总是有逗号,而您在其他任何地方都没有逗号,VFP 的 GETWORDNUM() 函数可以让这变得简单:

          REPLACE ALL DebBillAdd3 WITH GetWordNum(DebBillAdd1, 4, ","), ;
                  DebBillAdd2 WITH GetWordNum(DebBillAdd1, 3, ","), ;
                  DebBillAdd1 WITH GetWordNum(DebBillAdd1, 1, ",") + "," + GetWordNum(DebBillAdd1, 2, ",")
          

          添马舰

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-11-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-01-19
            • 1970-01-01
            相关资源
            最近更新 更多