You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

代码关键逻辑说明

  1. 单词拆分:通过递归CTEWordSplit将输入字符串按空格拆分为单个单词,同时记录每个单词的位置,确保拼接时和原字符串的单词顺序一致。
  2. 差异化处理:
    • 长度为3的单词直接保留原始大小写
    • 其他长度的单词统一处理为首字母大写、其余字母小写
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 14:40:17