如何从SQL Server查询返回的数据中提取短横线后的首字母
提取短横线后首字母并拼接的SQL Server实现
这个需求其实很容易实现,核心就是拆分字符串、提取目标字符、再拼接回去这三步,下面根据你使用的SQL Server版本给出具体方案:
方法一:适用于SQL Server 2017及以上版本(推荐)
这个版本支持STRING_AGG和STRING_SPLIT,代码简洁直观:
-- 定义你的输入字符串 DECLARE @InputString NVARCHAR(MAX) = '1234-A 2345-BB 3456-C 5678-CC 4567-AA 6789-B 01234-A 26857-ZZ'; -- 执行查询得到结果 SELECT STRING_AGG(SUBSTRING(value, CHARINDEX('-', value) + 1, 1), ' ') AS FormattedResult FROM STRING_SPLIT(@InputString, ' ');
代码解释:
STRING_SPLIT(@InputString, ' '):把输入的长字符串按空格拆分成单独的行,每一行对应一个类似1234-A的元素CHARINDEX('-', value):定位每个元素中短横线-的位置,加1后就是短横线后第一个字符的起始位置SUBSTRING(value, ..., 1):从起始位置截取1个字符,也就是我们需要的首字母STRING_AGG(..., ' '):把所有提取到的首字母用空格拼接成最终的结果字符串
方法二:适用于SQL Server 2016及以下版本(无STRING_AGG)
如果你的版本不支持STRING_AGG,可以用FOR XML PATH的方式来拼接结果:
DECLARE @InputString NVARCHAR(MAX) = '1234-A 2345-BB 3456-C 5678-CC 4567-AA 6789-B 01234-A 26857-ZZ'; SELECT STUFF(( -- 对每个拆分后的元素提取首字母,前面加空格 SELECT ' ' + SUBSTRING(value, CHARINDEX('-', value) + 1, 1) FROM STRING_SPLIT(@InputString, ' ') FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS FormattedResult;
代码解释:
FOR XML PATH(''), TYPE:把每行的查询结果拼接成一段XML文本.value('.', 'NVARCHAR(MAX)'):把XML文本转换为普通字符串STUFF(..., 1, 1, ''):去掉字符串开头多余的第一个空格
健壮性优化:处理无短横线的元素
如果你的输入字符串中可能存在没有短横线的元素,可以加个判断避免报错,比如返回空字符串或者自定义默认值:
DECLARE @InputString NVARCHAR(MAX) = '1234-A 2345-BB no-dash-here 5678-CC'; SELECT STRING_AGG( CASE WHEN CHARINDEX('-', value) > 0 THEN SUBSTRING(value, CHARINDEX('-', value) + 1, 1) ELSE '' -- 这里可以替换成你需要的默认值,比如'?' END, ' ') AS FormattedResult FROM STRING_SPLIT(@InputString, ' ');
内容的提问来源于stack exchange,提问作者N West




