【问题标题】:SQL Capitalize first letter except 3 letter wordsSQL 首字母大写,除了 3 个字母的单词
【发布时间】:2023-01-26 23:40:48
【问题描述】:

我需要一个 SQL 语句(函数)来将每个单词的首字母大写,其他字符必须小写。我不知道该怎么做的部分是我需要保留 3 个字母单词的结构

话可以是这样的:

点食品, 点食物, 加拿大公司, 加拿大公司,

预期的 :

点食品, 点食品, 加拿大公司 , 加拿大公司,

有了这个功能,我得到了我需要的一切,除了最后一部分有 3 个词:

CREATE FUNCTION CAP(@String VARCHAR(8000))
RETURNS VARCHAR(8000)
AS
  BEGIN
      DECLARE @Position INT;

      SELECT @String = STUFF(Lower(@String), 1, 1, UPPER(LEFT(@String, 1)))
                       COLLATE
                              Latin1_General_Bin,
             @Position = PATINDEX('%[^A-Za-z''][a-z]%',
                         @String COLLATE Latin1_General_Bin);

      WHILE @Position > 0
        SELECT @String = STUFF(@String, @Position, 2, UPPER(
                                             Substring(@String, @Position, 2)))
                                                    COLLATE
                                                    Latin1_General_Bin,
               @Position = PATINDEX('%[^A-Za-z''][a-z]%',
                           @String COLLATE Latin1_General_Bin);

      RETURN @String;
  END; 

【问题讨论】:

  • 什么版本的 SQL Server?
  • 正如您已经从当前函数中发现的那样,T-SQL 是一个真的必须使用糟糕的语言来执行此操作,因为它的字符串处理能力总之是垃圾。如果可能的话,请考虑将此步骤移动到您执行 ETL/数据摄取的任何方式,或者如果仅用于显示目的则移动到表示层。
  • 当前使用:SQL Server Management Studio 15.0.18338.0
  • @Ace Management Studio 只是一个 IDE,而不是实际的 SQL Server。执行 @@version 并显示该结果
  • 您使用的 SSMS 版本并未告诉我们您使用的 SQL Server 版本。

标签: sql azure-sql-database


【解决方案1】:

当您使用 Azure SQL 数据库时,您可以访问 STRING_SPLIT 的新参数,序数.这意味着您可以因此分裂每个空格处的字符串 (' ') 并返回序号位置。然后您可以使用ordinal列重新聚合字符串以保持顺序,并使用CASE表达式检查值的长度;如果它是 3 个(或更少)字符,则保持原样,但是,如果不是 UPPER 第一个字符和 LOWER 其余字符:

DECLARE @YourString varchar(8000) = 'DOT FOODS , dot foods , CANADA COMPANY, INC CANADA COMPANY, inc';

SELECT STRING_AGG(CASE WHEN LEN(SS.value) <= 3 THEN SS.value
                       ELSE UPPER(LEFT(SS.Value,1)) + LOWER(STUFF(SS.Value,1,1,''))
                  END,' ') WITHIN GROUP (ORDER BY SS.ordinal)
FROM STRING_SPLIT(@YourString, ' ',1) SS;

db<>fiddle

【讨论】:

    猜你喜欢
    • 2012-07-24
    • 2020-08-30
    • 2016-12-05
    • 2015-11-10
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 2015-11-04
    • 2017-08-02
    相关资源
    最近更新 更多