【问题标题】:Trim the data and put in separate columns修剪数据并放在单独的列中
【发布时间】:2020-07-24 20:32:50
【问题描述】:

我在单列表中有以下记录。

         **Name**
Aaa.bbb:ccc;ddd;eee;fff
Www.xxx:yyy;zzz;rrr;hhh

我正在寻找类似这样的输出:

Name1 name2 name3 name4 name5 name6
Aaa   bbb    ccc   ddd   eee   fff
Www   xxx    yyy   zzz   rrr   hhh

请帮助选择查询来完成此操作。

谢谢。

【问题讨论】:

    标签: sql sql-server sql-scripts


    【解决方案1】:

    大概是这样的

    Select A.[Name]
          ,C.*
     From  YourTable A
     Cross Apply ( values ( replace(replace([Name],'.',';'),':',';') ))B(CleanString)
     Cross Apply (
                    Select Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(100)')))  
                          ,Pos2 = ltrim(rtrim(xDim.value('/x[2]','varchar(100)')))
                          ,Pos3 = ltrim(rtrim(xDim.value('/x[3]','varchar(100)')))
                          ,Pos4 = ltrim(rtrim(xDim.value('/x[4]','varchar(100)')))
                          ,Pos5 = ltrim(rtrim(xDim.value('/x[5]','varchar(100)')))
                          ,Pos6 = ltrim(rtrim(xDim.value('/x[6]','varchar(100)')))
                    From  (Select Cast('<x>' + replace(CleanString,';','</x><x>')+'</x>' as xml) as xDim) as A 
                 ) C
    

    退货

    【讨论】:

      【解决方案2】:

      您也可以使用字符串方法进行直接查询,例如

      select substring(name, 1, charindex('.', name) - 1) as name1,
             substring(name, charindex('.', name) + 1, charindex(':', name) - charindex('.', name) -1) as name2,
             substring(name, charindex(':', name) + 1, charindex(';', name) -  charindex(':', name)  -1) as name3,
             substring(name, charindex(';', name) + 1, charindex(';', name,charindex(';', name) + 1) - charindex(';', name)-1) as name4,
             substring(name, charindex(';', name,charindex(';', name) + 1) + 1, charindex(';', name,charindex(';', name,charindex(';', name) + 1) + 1) - charindex(';', name,charindex(';', name) + 1) -1) as name5,
             substring(name, charindex(';', name,charindex(';', name,charindex(';', name) + 1) + 1) + 1, LEN(Name) - charindex(';', name,charindex(';', name,charindex(';', name) + 1) + 1) as name6
      from YourTable
             
      

      但它仍然变得非常复杂。

      如果可能的话,最好的选择是寻找一种不同的格式来存储您的数据。

      【讨论】:

        【解决方案3】:

        如果您使用的是 SQL Server 2016 或更高版本,则可以使用 string_split 以获得更好的性能。 请尝试以下操作:

        ;WITH cte AS(
        SELECT [Name]
              ,value 
              ,ROW_NUMBER() OVER(PARTITION BY [Name] ORDER BY (SELECT NULL)) as rn
        FROM @t t
            CROSS APPLY STRING_SPLIT(replace(replace([Name], '.', ';'), ':', ';'), ';') AS ss
        )
        SELECT
               [1] AS Name1
              ,[2] AS Name2
              ,[3] AS Name3
              ,[4] AS Name4
              ,[5] AS Name5
              ,[6] AS Name6
        FROM cte
        PIVOT(
            MAX(VALUE)
            FOR RN IN([1],[2],[3],[4],[5],[6])
        ) as PVT
        

        db小提琴here.

        请在here找到更多关于性能的信息。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-01-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-14
          • 2015-09-27
          相关资源
          最近更新 更多