【问题标题】:Splitting a string in sql for all characters将sql中的字符串拆分为所有字符
【发布时间】:2018-08-03 00:14:57
【问题描述】:

我试图在空格分隔符上拆分 SQL 中的字符串。空格数会发生变化,因此可以有 4 或 5 列的值。我正在尝试使用CHARINDEXSUBSTRING,但无法通过第一个分隔符。

示例:

输入将是'444 Addison Avenue SA 5222'

【问题讨论】:

    标签: sql sql-server tsql split sql-server-2016


    【解决方案1】:

    要拆分成列,您可以使用一些 XML 与 CROSS APPLY 配合使用

    示例

    Declare @YourTable Table ([SomeCol] varchar(50))
    Insert Into @YourTable Values 
     ('444 Addison Avenue SA 5222')
    ,('1 Washington Square')
    
    
    Select A.*
          ,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)')))
                          ,Pos4 = ltrim(rtrim(xDim.value('/x[4]','varchar(max)')))
                          ,Pos5 = ltrim(rtrim(xDim.value('/x[5]','varchar(max)')))
                          ,Pos6 = ltrim(rtrim(xDim.value('/x[6]','varchar(max)')))
                    From  (Select Cast('<x>' + replace((Select replace([SomeCol],' ','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A 
                 ) B
    

    退货

    【讨论】:

    • 谢谢约翰,但我得到一个 XML 解析错误。 XML 解析:第 1 行,字符 13,非法名称字符
    • @Sth3 我怀疑你有一些非 XML 安全文本。一瞬间
    • @JohnCappelletti 你能解释一下这个§§Split§§是什么吗?
    • @Cool_Br33ze 只是从 Snugo (XML Ninja) 中学到的一个小技巧。这个想法是创建一个真正独特的字符串的分隔符......你在现实世界中看不到的东西。 hth.
    • 谢谢,@JohnCappelletti,我会解决这个问题
    【解决方案2】:

    只有基于XML的分割才能达到同样的效果:

    DECLARE @tmp TABLE ([Address] varchar(50))
    INSERT INTO @tmp VALUES ('444 Addison Avenue SA 5222'),('1 Washington Square')
    
    SELECT T.[Address]
        ,AddressElements.value(N'/x[1]','varchar(max)') AS Element_1 
        ,AddressElements.value(N'/x[2]','varchar(max)') AS Element_2 
        ,AddressElements.value(N'/x[3]','varchar(max)') AS Element_3 
        ,AddressElements.value(N'/x[4]','varchar(max)') AS Element_4 
        ,AddressElements.value(N'/x[5]','varchar(max)') AS Element_5 
    FROM ( 
        SELECT [Address]
            ,CAST('<x>' + REPLACE([Address],' ','</x><x>') + '</x>' AS XML) AS AddressElements 
        FROM @tmp 
    ) T
    

    结果:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-04
      • 1970-01-01
      • 1970-01-01
      • 2014-12-12
      • 2016-04-18
      • 2017-04-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多