代码之家  ›  专栏  ›  技术社区  ›  Ehsan Akbar

插入到表中并拆分SQL中的字符串

  •  2
  • Ehsan Akbar  · 技术社区  · 5 年前

    我想将拆分字符串插入到我的表中,如您所见:

    create table #Organization
    (
        organizationId bigint, 
         provienceId bigint, 
         CityId bigint, 
          TownId bigint 
    
    )
    Insert Into #Organization  ( organizationId) 
     select  p.value from  string_split('1,2,3', ',') p
    Insert Into #Organization  ( provienceId) 
     select  p.value from  string_split('1,2,3', ',') p
    Insert Into #Organization  ( CityId) 
     select  p.value from  string_split('1,2,3', ',') p
    Insert Into #Organization  ( TownId) 
     select  p.value from  string_split('1,2,3', ',') p
    

    我期望的结果是这样的:

    1   1     1   1
    2   2     2   2
    3   3     3   3
    

    但它会返回:

    enter image description here

    3 回复  |  直到 5 年前
        1
  •  3
  •   John Cappelletti    5 年前

    也许我在读你的问题,但我怀疑你想把你的字符串分成几列

    例子

    Declare @YourTable table (SomeColName varchar(max)) 
    Insert Into @YourTable values 
     ('1,2,3')
    ,('A,B,C')
    ,('Dog,Cat,Pony')
    
    Select B.*
     From  @YourTable A
     Cross Apply (
                    Select Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(max)')))
                          ,Pos2 = ltrim(rtrim(xDim.value('/x[2]','varchar(max)')))
                          ,Pos3 = ltrim(rtrim(xDim.value('/x[3]','varchar(max)')))
                    From  (Select Cast('<x>' + replace((Select replace(SomeColName ,',','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A 
                 ) B
    

    退换商品

    Pos1    Pos2    Pos3
    1       2       3
    A       B       C
    Dog     Cat     Pony
    
        2
  •  2
  •   Gordon Linoff    5 年前

    插入是插入三行,每个值一行。如果您想将它们组合成列,您需要将它们透视,或者(如我所愿)使用聚合。

    您还有一个包含四列的表,但似乎只插入了三列,因此我怀疑您需要:

    create table #Organization (
        organizationId int identity(1, 1) primary key, 
        provinceId int, 
        CityId int, 
        TownId int 
    );
    

    (我不认为有必要 bigint 对于本例。)

    显然,最简单的解决方案是不使用字符串:

    Insert Into #Organization (provinceId, CityId, TownId) 
        values (1, 2, 3);
    

    但如果您使用的是字符串,则可以尝试:

    Insert Into #Organization (provinceId, CityId, TownId) 
        select provinceId, CityId, TownId
        from (values('1,2,3')) v(str) cross apply
             (select max(case when seqnum = 1 then p.value end) as provinceid,
                     max(case when seqnum = 2 then p.value end) as cityid,
                     max(case when seqnum = 3 then p.value end) as townid                 
              from (select p.*,
                           row_number() over (order by charindex(',' + p.value + ',', ',' + v.str + ',')) as seqnum
                    from string_split(v.str, ',') p
                   ) p
             ) s;
    

    请注意,使用时出现问题 string_split() 为此,因为它不“记住”子字符串在原始字符串中的位置。这试图通过使用 charindex() . 在您的情况下,这将有效,因为值都是数字。

    Here 是db<>小提琴。

        3
  •  0
  •   Kevin    5 年前

    我将使用PIVOT将列转换为行。像:

    INSERT INTO #organization 
                (provinceid, 
                 cityid, 
                 townid) 
    SELECT * 
    FROM   (SELECT p.value, 
                   RowN = Row_number() 
                            OVER ( 
                              ORDER BY (SELECT NULL)) 
            FROM   String_split('1,2,3', ',') p) a 
           PIVOT (Max(a.value) 
                 FOR rown IN ([1], 
                              [2], 
                              [3])) b