从InitCap函数中减少一些字

问题描述 投票:0回答:1

我在 SQL Server 2016 中有这个函数可以将第一个字符更改为大写:

FUNCTION [dbo].[InitCap] ( @InputString varchar(4000) ) 
RETURNS VARCHAR(4000)
AS
BEGIN

DECLARE @Index          INT
DECLARE @Char           CHAR(1)
DECLARE @PrevChar       CHAR(1)
DECLARE @OutputString   VARCHAR(255)

SET @OutputString = LOWER(@InputString)
SET @Index = 1

WHILE @Index <= LEN(@InputString)
BEGIN
    SET @Char     = SUBSTRING(@InputString, @Index, 1)
    SET @PrevChar = CASE WHEN @Index = 1 THEN ' '
                         ELSE SUBSTRING(@InputString, @Index - 1, 1)
                    END

    IF @PrevChar IN (' ', ';', ':', '!', '?', ',', '.', '_', '-', '/', '&', '''', '(')
    BEGIN
        IF @PrevChar != '''' OR UPPER(@Char) != 'S'
            SET @OutputString = STUFF(@OutputString, @Index, 1, UPPER(@Char))
    END

    SET @Index = @Index + 1
END

RETURN @OutputString

END

但现在我需要列表中的某些单词总是较低:

de
da
do
dos
das
d'

如何更改代码来修复它?

sql sql-server t-sql
1个回答
0
投票

我认为听取 HABO 的建议可能是最实用的。我修改了代码并添加了每个单词的评估以检查列表

FUNCTION [dbo].[InitCap] ( @InputString varchar(4000) ) 

RETURNS VARCHAR(4000)
AS

BEGIN

DECLARE @Index INT
DECLARE @Char CHAR(1)
DECLARE @PrevChar CHAR(1)
DECLARE @OutputString VARCHAR(4000)
DECLARE @CurrentWord VARCHAR(255)
DECLARE @WordStartIndex INT

-- Table to hold words that should always be lowercase
DECLARE @LowercaseWords TABLE (Word VARCHAR(255))

-- Populate the table with words that must remain in lowercase
INSERT INTO @LowercaseWords (Word)
VALUES ('and'), ('the'), ('of'), ('in'), ('on'), ('or'), ('to'), ('for') -- Add your words that you want lower caps in here.

SET @OutputString = LOWER(@InputString)
SET @Index = 1
SET @CurrentWord = ''
SET @WordStartIndex = 1

WHILE @Index <= LEN(@InputString)
BEGIN
    SET @Char     = SUBSTRING(@InputString, @Index, 1)
    SET @PrevChar = CASE WHEN @Index = 1 THEN ' '
                         ELSE SUBSTRING(@InputString, @Index - 1, 1)
                    END

    -- Check if new word is starting
    IF @PrevChar IN (' ', ';', ':', '!', '?', ',', '.', '_', '-', '/', '&', '''', '(')
    BEGIN
        -- Reset current word
        SET @CurrentWord = ''
        SET @WordStartIndex = @Index
    END

    -- Append current character to current word
    SET @CurrentWord = @CurrentWord + @Char


    IF @Char IN (' ', ';', ':', '!', '?', ',', '.', '_', '-', '/', '&', '''', '(', ')') OR @Index = LEN(@InputString)
    BEGIN
        -- Check if the current word is in the table of lowercase words
        IF NOT EXISTS (SELECT 1 FROM @LowercaseWords WHERE Word = LTRIM(RTRIM(@CurrentWord)))
        BEGIN
            SET @OutputString = STUFF(@OutputString, @WordStartIndex, 1, UPPER(SUBSTRING(@CurrentWord, 1, 1)))
        END
    END

    SET @Index = @Index + 1
END

RETURN @OutputString
END
© www.soinside.com 2019 - 2024. All rights reserved.