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

mgdq6dx1  于 2021-07-24  发布在  Java
关注(0)|答案(3)|浏览(322)

我在下表中有一个单列记录。

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

我正在寻找这样的输出:

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

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

lawou6xi

lawou6xi1#

也许是这样的

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

退货

展开查看全部
3b6akqbq

3b6akqbq2#

您还可以使用字符串方法执行直接查询,如

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

但后来还是变得很复杂。
如果可能的话,最好的选择是寻找一种不同的格式来存储数据。

nwwlzxa7

nwwlzxa73#

如果您使用的是sql server 2016或更高版本,则可以使用string\u split以获得更好的性能。请尝试以下操作:

  1. ;WITH cte AS(
  2. SELECT [Name]
  3. ,value
  4. ,ROW_NUMBER() OVER(PARTITION BY [Name] ORDER BY (SELECT NULL)) as rn
  5. FROM @t t
  6. CROSS APPLY STRING_SPLIT(replace(replace([Name], '.', ';'), ':', ';'), ';') AS ss
  7. )
  8. SELECT
  9. [1] AS Name1
  10. ,[2] AS Name2
  11. ,[3] AS Name3
  12. ,[4] AS Name4
  13. ,[5] AS Name5
  14. ,[6] AS Name6
  15. FROM cte
  16. PIVOT(
  17. MAX(VALUE)
  18. FOR RN IN([1],[2],[3],[4],[5],[6])
  19. ) as PVT

db<>在这里摆弄。
请在这里找到更多关于性能的信息。

展开查看全部

相关问题