【问题标题】:Split string with value and order criteria使用值和顺序标准拆分字符串
【发布时间】:2019-10-11 12:52:57
【问题描述】:

嘿,我希望在 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 有一个限制:我无权创建函数,这使得它更具挑战性。无论如何,感谢您的帮助和耐心。

【问题讨论】:

  • 选项是否总是像示例中那样从 1 开始的简单升序?选项和选项代码中的值是否始终相同?
  • 这可能是我见过的最落后的 SQL 模式实现。你能改变结构吗?
  • @BarneyL 我现在看到有时我在选项中有字母,但关系总是上升的。是的。是的,Options 和 OptionCodes 中总是有相同数量的值
  • SQL Server 版本?是否保证选项和选项代码不会包含重复值,例如a,b,c,a?
  • @JacobH 我希望我可以,这不是我的数据库设计,我现在只使用 ETL...

标签: sql-server csv tsql sql-order-by


【解决方案1】:

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

Demo on db<>fiddle

【讨论】:

  • 有趣的方式来解决 MS 的巨大失误,不包括序数位置。如果他们正确地完成了 string_split,那将是一个非常棒的补充。不幸的是,他们错过了这么简单的信息。
  • 完美运行。谢谢!
猜你喜欢
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多