是否可以使用正确的SQL代码将文本从SQL Server中的表列转换为PascalCase?
TABLE DEFINITION
----------------------
ID int
CITTA varchar(50)
PROV varchar(50)
CAP varchar(50)
COD varchar(50)
包含要转换的文字的字段为CITTA
。它包含所有大写值,如“ABANO TERME”,“ROMA”等。这些单词由空格分隔。
修改
我忘了提到一些单词中有一个重音字符'
。这个字符可以在单词的末尾或中间找到。
编辑2:
在结果中发现了一些怪癖:
答案 0 :(得分:4)
DECLARE @T TABLE
(
ID INT PRIMARY KEY,
CITTA VARCHAR(50)
)
INSERT INTO @T
SELECT 1, 'ABANO TERME' UNION ALL SELECT 2, 'ROMA' UNION ALL SELECT 3, 'ISOLA D''ASTI';
IF OBJECT_ID('tempdb..#HolderTable') IS NOT NULL
DROP TABLE #HolderTable
CREATE TABLE #HolderTable
(
Idx INT IDENTITY(1,1) PRIMARY KEY,
ID INT,
Word VARCHAR(50)
)
CREATE NONCLUSTERED INDEX ix ON #HolderTable(ID)
;
WITH T1 AS
(
SELECT ID, CAST(N'<root><r>' + REPLACE(REPLACE(CITTA, '''', '''</r><r>'), ' ', ' </r><r>') + '</r></root>' AS XML) AS xl
FROM @T
)
INSERT INTO #HolderTable
SELECT ID,
r.value('.','NVARCHAR(MAX)') AS Item
FROM T1
CROSS APPLY
xl.nodes('//root/r') AS RECORDS(r)
SELECT
ID,
(SELECT STUFF(LOWER(Word),1,1,UPPER(LEFT(Word,1))) FROM #HolderTable WHERE [@T].ID = #HolderTable.ID ORDER BY Idx FOR XML PATH('') )
FROM @T [@T]
答案 1 :(得分:3)
我建议您稍后尝试我在博客中发布的代码。我怀疑它能够很好地满足您的要求,并且比许多其他方法表现更好。
SQL Server Proper Case Function
CREATE FUNCTION dbo.Proper(@DATA VARCHAR(8000))
RETURNS VARCHAR(8000)
AS
BEGIN
DECLARE @Position INT
SELECT @DATA = STUFF(LOWER(@DATA), 1, 1, UPPER(LEFT(@DATA, 1))),
@Position = PATINDEX('%[^a-zA-Z][a-z]%', @DATA COLLATE Latin1_General_Bin)
WHILE @Position > 0
SELECT @DATA = STUFF(@DATA, @Position, 2, UPPER(SUBSTRING(@DATA, @Position, 2))),
@Position = PATINDEX('%[^a-zA-Z][a-z]%', @DATA COLLATE Latin1_General_Bin)
RETURN @DATA
END
此函数比大多数函数快一点,因为它只对每个需要大写字母的单词循环一次。
答案 2 :(得分:2)
尝试以下功能(根据需要调整字符串类型)。只是不要在WHERE子句中使用它 - 并考虑其他地方的性能后果。 12345678只是一些任意大的值,您可能希望用更合适的东西替换它!
CREATE FUNCTION dbo.ufn_PascalCase(@str AS VARCHAR(MAX)) RETURNS VARCHAR(MAX)
BEGIN
SET @str = LOWER(@str)
DECLARE @result VARCHAR(MAX) = ''
DECLARE @spaceIndex INTEGER = CHARINDEX(' ', @str)
WHILE @spaceIndex > 0
BEGIN
SET @result += UPPER(SUBSTRING(@str, 1, 1)) + SUBSTRING(@str, 2, @spaceIndex - 2)
SET @str = SUBSTRING(@str, @spaceIndex + 1, 12345678)
SET @spaceIndex = CHARINDEX(' ', @str)
END
SET @result += UPPER(SUBSTRING(@str, 1, 1)) + SUBSTRING(@str, 2, 12345678)
RETURN @result
END
答案 3 :(得分:0)
从SQL 2017开始,您可以非常优雅地完成此操作。与其他一些答案不同,这是按要求提供的PascalCase,而不是适当的大小写。它也适用于下划线或空格(以及连续多个)。
CREATE OR ALTER FUNCTION dbo.fnPascalCase(@word NVARCHAR(MAX)) RETURNS NVARCHAR(MAX)
BEGIN
DECLARE @t1 TABLE (Val NVARCHAR(MAX));
INSERT INTO @t1 (Val)
SELECT Val = UPPER(SUBSTRING(LTRIM(RTRIM(value)), 1, 1)) + LOWER(SUBSTRING(LTRIM(RTRIM(value)), 2, 2000000000)) FROM STRING_SPLIT(REPLACE(@word, ' ', '_'), '_')
DECLARE @result NVARCHAR(MAX);
SELECT @result = STRING_AGG(Val, '') FROM @t1
RETURN @result
END
用法:
SELECT dbo.fnPascalCase('taco___tuesday is today') --Returns 'TacoTuesdayIsToday`
SELECT dbo.fnPascalCase('HELLO MY fRiEnD') --Returns 'HelloMyFriend`