T-SQL 2017 无自定义函数实现多分隔符首字母大写及拆分序修复
问题背景
我需要确认是否存在更优的SQL实现方案,同时满足以下要求:
- 完成字符串中每个单词首字母大写的格式化效果
- 修复字符串拆分过程中可能出现的结果顺序错乱问题
- 支持便捷扩展,可快速新增其他需要识别的单词分隔符
该功能用于报表场景,核心要求为不使用用户定义函数,保证代码可以直接内嵌在报表中运行。
我目前已经写出支持扩展分隔符的实现,当前示例适配了空格、短横线两种分隔符,需要确认该写法是否为最优实现。
现有参考代码
适配两种分隔符、已修复拆分顺序问题的版本
/* 所有单词首字母大写,修复字符串拆分顺序问题,支持识别短横线('-')后的单词首字母大写 */ SELECT RIGHT(((SELECT ' '+(UPPER(LEFT([value], 1))+SUBSTRING([value], 2, LEN([Column]))) FROM(SELECT [value], ROW_NUMBER() OVER (ORDER BY [pointer]) AS [p] FROM(SELECT [value], CHARINDEX(' '+[value]+' ', ' '+[Column]+' ') AS [pointer] FROM STRING_SPLIT((SELECT '-'+(UPPER(LEFT([value], 1))+LOWER(SUBSTRING([value], 2, LEN([Column])))) FROM(SELECT [value], ROW_NUMBER() OVER (ORDER BY [pointer]) AS [p2] FROM(SELECT [value], CHARINDEX('-'+[value]+'-', '-'+[Column]+'-') AS [pointer] FROM STRING_SPLIT([Column], '-')) AS [sp2] ) AS [s2] FOR XML PATH('')), ' ')) AS [sp] ) AS [s] FOR XML PATH(''))), LEN([Column])) AS [Column_Cased] FROM [Database].[Table];
仅适配单个分隔符的简化版本
SELECT (SELECT ' '+(UPPER(LEFT([value], 1))+LOWER(SUBSTRING([value], 2, LEN([Column])))) FROM(SELECT [value], ROW_NUMBER() OVER (ORDER BY [pointer]) AS [p] FROM(SELECT [value], CHARINDEX(' '+[value]+' ', ' '+[Column]+' ') AS [pointer] FROM STRING_SPLIT([Column], ' ')) AS [sp] ) AS [s] FOR XML PATH('')) AS [Column_Cased] FROM [Database].[Table];
适配两种分隔符、未修复拆分顺序问题的版本
SELECT RIGHT(((SELECT ' '+(UPPER(LEFT([value], 1))+SUBSTRING([value], 2, LEN([Column]))) FROM(SELECT [value] FROM STRING_SPLIT((SELECT '-'+(UPPER(LEFT([value], 1))+LOWER(SUBSTRING([value], 2, LEN([Column])))) FROM(SELECT [value] FROM STRING_SPLIT([Column], '-')) AS [s2] FOR XML PATH('')), ' ')) AS [s] FOR XML PATH(''))), LEN([Column])) AS [Column_Cased] FROM [Database].[Table];
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

