首页 > 解决方案 > SQL 从一组值中选择

问题描述

我有一个字段,其中包含用 ~ 分隔的连续值组。

57|0|0|2|||~56|0|0|2|||~55|0|0|2|||~54|0|0|3|4|5|~53|0|0|4|||~52|0|0|4|||~51|0|0|2|||~

每个组都以一个 ID 开头,例如 54 个后面的 5 个值,用 | 分隔。例如|0|0|3|4|5| 并以〜结尾。如果我有一个 id 例如 ID=54 我想选择 3,我如何从最后选择第三个值;

任何帮助都感激不尽。

标签: sqlsql-server

解决方案


您可以使用 Shuumi 中的函数将字符串拆分为行,并使用其他问题的代码将单独的行拆分为列。然后你在表中有数据,你可以做正常的选择:

;WITH Split_Names (ElementID,Element, xmlname)
AS
(
    SELECT ElementID,
    Element,
    CONVERT(XML,'<Names><name>'  
    + REPLACE(Element,'|', '</name><name>') + '</name></Names>') AS xmlname
      FROM [dbo].[func_Split] ('57|0|0|2|||~56|0|0|2|||~55|0|0|2|||~54|0|0|3|4|5|~53|0|0|4|||~52|0|0|4|||~51|0|0|2|||~','~') 
)

 SELECT Element,      
 xmlname.value('/Names[1]/name[1]','varchar(100)') AS ID,    
 xmlname.value('/Names[1]/name[2]','varchar(100)') AS Element1,    
 xmlname.value('/Names[1]/name[3]','varchar(100)') AS Element2,    
 xmlname.value('/Names[1]/name[4]','varchar(100)') AS Element3,    
 xmlname.value('/Names[1]/name[5]','varchar(100)') AS Element4,    
 xmlname.value('/Names[1]/name[6]','varchar(100)') AS Element5    
 INTO #tmp
 FROM Split_Names

 SELECT Element3 FROM #tmp WHERE ID = 54

推荐阅读