修剪数据并放在单独的列中
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找到更多关于性能的信息。
【讨论】:
以上是关于修剪数据并放在单独的列中的主要内容,如果未能解决你的问题,请参考以下文章
Python:将系列添加到数据框架中,并没有将数据放在正确的列中。
将 Spark Dataframe 中的多个列发送到外部 API 并将结果存储在单独的列中