55

SQLServerで文字列内の各単語の最初の文字を大文字にする最良の方法は何ですか。

4

18 に答える 18

81

http://www.sql-server-helper.com/functions/initcap.aspxから

CREATE 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
GO

ここには、より単純で小さいものがあります(ただし、行にスペースがない場合は機能しません。「無効な長さパラメーターがRIGHT関数に渡されました。」):

http://www.devx.com/tips/Tip/17608

于 2008-09-10T19:09:23.647 に答える
2

私がかなり長い間使用してきたもののバリエーションは次のとおりです。

CREATE FUNCTION [widget].[properCase](@string varchar(8000)) RETURNS varchar(8000) AS
BEGIN   
    SET @string = LOWER(@string)
    DECLARE @i INT
    SET @i = ASCII('a')
    WHILE @i <= ASCII('z')
    BEGIN
        SET @string = REPLACE( @string, ' ' + CHAR(@i), ' ' + CHAR(@i-32))
        SET @i = @i + 1
    END
    SET @string = CHAR(ASCII(LEFT(@string, 1))-32) + RIGHT(@string, LEN(@string)-1)
    RETURN @string
END

必要に応じて、スペース以外の項目の後の文字を処理するように簡単に変更できます。

于 2008-09-10T19:55:00.527 に答える
2

これは、最も単純な 1 行のコードです。

select 
        LEFT(column, 1)+ lower(RIGHT(column, len(column)-1) )
     from [tablename]
于 2015-07-22T21:09:23.020 に答える
2

ループを使用しない別のソリューション - 再帰 CTE を使用した純粋なセットベースのアプローチ

create function [dbo].InitCap (@value varchar(max))
returns varchar(max) as
begin

    declare
        @separator char(1) = ' ',
        @result varchar(max) = '';

    with r as (
        select value, cast(null as varchar(max)) [x], cast('' as varchar(max)) [char], 0 [no] from (select rtrim(cast(@value as varchar(max))) [value]) as j
        union all
        select right(value, len(value)-case charindex(@separator, value) when 0 then len(value) else charindex(@separator, value) end) [value]
        , left(r.[value], case charindex(@separator, r.value) when 0 then len(r.value) else abs(charindex(@separator, r.[value])-1) end ) [x]
        , left(r.[value], 1)
        , [no] + 1 [no]
        from r where value > '')

    select @result = @result +
    case
        when ascii([char]) between 97 and 122 
            then stuff(x, 1, 1, char(ascii([char])-32))
        else x
    end + @separator
    from r where x is not null;

    set @result = rtrim(@result);

    return @result;
end
于 2015-01-02T13:22:04.507 に答える
0

次のように簡単にできます。

DECLARE @Name VARCHAR(10) = 'merin';

SELECT @Name AS Name, REPLACE(@Name, LEFT(@Name, 1),  UPPER(LEFT(@Name, 1))) AS CapitalizedName

ここに画像の説明を入力

于 2021-06-02T18:56:22.540 に答える
-3

代わりにこれを試してください

Select INITCAP(column_name) from table_name;

これにより、言及された属性エントリの最初の文字が大文字になります。

于 2016-09-13T18:00:12.583 に答える