首页 > 解决方案 > 使用值和顺序标准拆分字符串

问题描述

嘿,我希望在 Table1 中拆分字符串时得到一些帮助:

  ID           Level    Options          OptionCodes
  A5CF-601     G;8      1,2,3            4958,2669,26
  88C0-0EA     G;9      1,2,3,4,5,6,7,8  2669,21,670,267,13,738,85,55
  BE95-196     G;6      Q,L,S,T          6705,6694,6693,6691

在拆分“选项”和“选项代码”后,我需要将“级别”与“选项”中的每个值与“-”连接起来。然后按照它们在字符串中出现的顺序将每个串联与“OptionCodes”相关联。

期望的结果是:

 LevelOption   OptionCode
 G;8 - 1       4958     
 G;8 - 2       2669     
 G;8 - 3       26       
 G;9 - 1       2669     
 G;9 - 2       21       
 G;9 - 3       760      
 G;9 - 4       267      
 G;9 - 5       13       
 G;9 - 6       738      
 G;9 - 7       85       
 G;9 - 8       55       
 G;6 - Q       6705     
 G;6 - L       6694     
 G;6 - S       6693     
 G;6 - T       6691 

我已经对 string_split、substring、charindex 等进行了一些试验。但仍然无法理解它。我使用 SQL Server 有一个限制:我无权创建函数,这使得它更具挑战性。无论如何,感谢您的帮助和耐心。

标签: sql-servercsvtsqlsql-order-by

解决方案


STRING_SPLIT不返回子字符串的索引位置。一个笨拙的解决方案是使用CHARINDEX在主字符串中定位子字符串的位置并使用结果对子字符串进行编号。不幸的是,这要求字符串不包含重复的子字符串。

查询如下所示:

WITH cte AS (
    SELECT ID
         , Level
         , o.value AS ov
         , c.value AS ocv
         , DENSE_RANK() OVER (PARTITION BY ID ORDER BY CHARINDEX(',' + o.value + ',', ',' + Options + ',')) AS rn1
         , DENSE_RANK() OVER (PARTITION BY ID ORDER BY CHARINDEX(',' + c.value + ',', ',' + OptionCodes + ',')) AS rn2
    FROM t
    CROSS APPLY STRING_SPLIT(Options, ',') AS o
    CROSS APPLY STRING_SPLIT(OptionCodes, ',') AS c
)
SELECT *
FROM cte
WHERE rn1 = rn2

db<>fiddle 上的演示


推荐阅读