SQL函数开发需求:单词首字母大写且保留3字母单词原有格式
完善SQL函数实现单词首字母大写且保留3字母单词原格式
需求说明
- 实现每个单词首字母大写、其余字母小写,但3字母单词需保留原有大小写结构
- 示例对应关系:
- 输入:
DOT FOODS→ 输出:DOT Foods - 输入:
dot foods→ 输出:dot Foods - 输入:
CANADA COMPANY INC→ 输出:Canada Company INC - 输入:
CANADA COMPANY inc→ 输出:Canada Company inc
- 输入:
原函数问题分析
原CAP函数会统一将所有单词处理为首字母大写、其余小写,无法识别并保留3字母单词的原始大小写格式,因此需要新增对单词长度的判断逻辑,针对性处理不同长度的单词。
完善后的函数代码
CREATE FUNCTION CAP(@String VARCHAR(8000)) RETURNS VARCHAR(8000) AS BEGIN -- 递归CTE拆分字符串为单词列表,记录单词位置保证拼接顺序 WITH WordSplit AS ( SELECT 1 AS Position, CHARINDEX(' ', @String) AS NextSpace, LEFT(@String, CHARINDEX(' ', @String + ' ') - 1) AS Word, STUFF(@String, 1, CHARINDEX(' ', @String + ' '), '') AS RemainingString UNION ALL SELECT Position + 1, CHARINDEX(' ', RemainingString), LEFT(RemainingString, CHARINDEX(' ', RemainingString + ' ') - 1), STUFF(RemainingString, 1, CHARINDEX(' ', RemainingString + ' '), '') FROM WordSplit WHERE RemainingString <> '' ), -- 按规则处理每个单词:3字母保留原格式,其余首字母大写+其余小写 ProcessedWords AS ( SELECT Position, CASE WHEN LEN(Word) = 3 THEN Word ELSE UPPER(LEFT(Word, 1)) + LOWER(SUBSTRING(Word, 2, LEN(Word) - 1)) END AS ProcessedWord FROM WordSplit ) -- 按原始顺序拼接处理后的单词 SELECT @String = STRING_AGG(ProcessedWord, ' ') WITHIN GROUP (ORDER BY Position) FROM ProcessedWords; RETURN @String; END;
代码关键逻辑说明
- 单词拆分:通过递归CTE
WordSplit将输入字符串按空格拆分为单个单词,同时记录每个单词的位置,确保拼接时和原字符串的单词顺序一致。 - 差异化处理:
- 长度为3的单词直接保留原始大小写
- 其他长度的单词统一处理为首字母大写、其余字母小写
- 结果拼接:使用
STRING_AGG函数按单词原始位置拼接处理后的内容,得到最终符合要求的字符串。
测试验证
执行以下语句验证函数效果:
SELECT dbo.CAP('DOT FOODS') AS Result; -- 输出:DOT Foods SELECT dbo.CAP('dot foods') AS Result; -- 输出:dot Foods SELECT dbo.CAP('CANADA COMPANY INC') AS Result; -- 输出:Canada Company INC SELECT dbo.CAP('CANADA COMPANY inc') AS Result; -- 输出:Canada Company inc
内容的提问来源于stack exchange,提问作者Ace
相关产品推荐
相关产品推荐

