SQLServerで文字列内の各単語の最初の文字を大文字にする最良の方法は何ですか。
質問する
89950 次
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関数に渡されました。」):
于 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 に答える
-3
代わりにこれを試してください
Select INITCAP(column_name) from table_name;
これにより、言及された属性エントリの最初の文字が大文字になります。
于 2016-09-13T18:00:12.583 に答える