T-SQL 首字母大写 - 保留 2-n 个字符
T-SQL initial capitalization - leave 2-n chars alone
我有一个在网上找到的 t-sql 函数,也许在堆栈上,它非常适合对字符串中的所有单词进行驼峰式大小写:
CREATE FUNCTION InitialCap(@String VARCHAR(75))
RETURNS VARCHAR(75)
AS
BEGIN
DECLARE @Position INT;
SELECT @String = STUFF(LOWER(@String),1,1,UPPER(LEFT(@String,1))) , @Position = PATINDEX('%[^A-Za-z''][a-z]%',@String);
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 ISNULL(@String,'');
END
问题是我现在需要一点点 mod 这样它就只剩下每个单词的第一个字母。我仍然希望它把每个单词的第一个字母大写,但我不希望它改变那个单词中的其他字母。所以这里有一些我想要的结果的例子:
'here is foo' -> 'Here Is Foo'
'i like the FBI' -> 'I Like The FBI'
对于第二个示例,请注意我上面显示的函数将 "FBI" 更改为 "Fbi",这就是问题所在。我不确定如何更改 sql 来实现它,以便将 FBI 保留为 FBI。当然,如果原始字符串是 "fbi",我知道它会将其更改为 "Fbi",这很好。
总而言之,我从来不希望函数将大写字母更改为小写字母。
只需去掉 STUFF() 中的 LOWER():
CREATE FUNCTION InitialCap(@String VARCHAR(75))
RETURNS VARCHAR(75)
AS
BEGIN
DECLARE @Position INT;
SELECT @String = STUFF(@String,1,1,UPPER(LEFT(@String,1))) , @Position = PATINDEX('%[^A-Za-z''][a-z]%',@String);
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 ISNULL(@String,'');
END
GO
DECLARE @String VARCHAR(75) = 'i like the FBI'
SELECT dbo.InitialCap(@String)
结果:
I Like The FBI
我有一个在网上找到的 t-sql 函数,也许在堆栈上,它非常适合对字符串中的所有单词进行驼峰式大小写:
CREATE FUNCTION InitialCap(@String VARCHAR(75))
RETURNS VARCHAR(75)
AS
BEGIN
DECLARE @Position INT;
SELECT @String = STUFF(LOWER(@String),1,1,UPPER(LEFT(@String,1))) , @Position = PATINDEX('%[^A-Za-z''][a-z]%',@String);
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 ISNULL(@String,'');
END
问题是我现在需要一点点 mod 这样它就只剩下每个单词的第一个字母。我仍然希望它把每个单词的第一个字母大写,但我不希望它改变那个单词中的其他字母。所以这里有一些我想要的结果的例子:
'here is foo' -> 'Here Is Foo'
'i like the FBI' -> 'I Like The FBI'
对于第二个示例,请注意我上面显示的函数将 "FBI" 更改为 "Fbi",这就是问题所在。我不确定如何更改 sql 来实现它,以便将 FBI 保留为 FBI。当然,如果原始字符串是 "fbi",我知道它会将其更改为 "Fbi",这很好。
总而言之,我从来不希望函数将大写字母更改为小写字母。
只需去掉 STUFF() 中的 LOWER():
CREATE FUNCTION InitialCap(@String VARCHAR(75))
RETURNS VARCHAR(75)
AS
BEGIN
DECLARE @Position INT;
SELECT @String = STUFF(@String,1,1,UPPER(LEFT(@String,1))) , @Position = PATINDEX('%[^A-Za-z''][a-z]%',@String);
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 ISNULL(@String,'');
END
GO
DECLARE @String VARCHAR(75) = 'i like the FBI'
SELECT dbo.InitialCap(@String)
结果:
I Like The FBI