修剪数据并放在单独的列中

Posted

技术标签:

【中文标题】修剪数据并放在单独的列中【英文标题】: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

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

谢谢。

【问题讨论】:

【参考方案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找到更多关于性能的信息。

【讨论】:

以上是关于修剪数据并放在单独的列中的主要内容,如果未能解决你的问题,请参考以下文章

SQL 解析数字数据的列字符串并存储在单独的列中

Python:将系列添加到数据框架中,并没有将数据放在正确的列中。

将 Spark Dataframe 中的多个列发送到外部 API 并将结果存储在单独的列中

从包含来自单独列的数据的列中选择数据

如何在android中分离JSON对并存储在sqlite数据库中?

数据框行中内容的修剪/截断平均值