sql-server - 使用值和顺序标准拆分字符串
问题描述
嘿,我希望在 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 有一个限制:我无权创建函数,这使得它更具挑战性。无论如何,感谢您的帮助和耐心。
解决方案
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
推荐阅读
- javascript - 导入 ReactJS 时出现“未捕获的语法错误:无法在模块外使用 import 语句”
- python - 我想在 python 中创建一个函数,它反转字符串中的每个字符并打印出反转的字符串
- c# - Automapper - 使用带有依赖注入的自定义类型转换器
- javascript - 分组并计算python或js中的项目数
- docker - 如何在 cloudbuild.yaml 中使用 Kaniko?
- php - 需要一个用于 php 和 nginx 的 dockerfile
- javascript - 当我使用animejs进行字母动画时,反应应用程序中的textContent错误
- firebase - 如何访问从 Firebase 实时数据库中提取和提取的地图中的对象值
- python - 如何在熊猫中测试 df['column'] 是否包含列表中的子字符串之一?
- amazon-web-services - 使用 AWS lamda 进行 Terraform