Pascalcaseでテキストを変換します
-
10-10-2019 - |
質問
適切な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:
結果に見られるいくつかの癖:
- 「Isola Balba」のような名前がある場合、この名前は「Isolabalba」に翻訳されます(正しいケースですが、スペースを逃しました)
- 「Isola d'Asti」のような名前がある場合、これは「Isolad'asti」に変換されます(以前と同じようにスペースを逃して誤ったケース。この場合、正しい結果は「Isola d'Asti」です。
この小さな問題についてアドバイスをくれませんか。
解決
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]
他のヒント
少し前にブログに投稿したコードを試してみることをお勧めします。私はそれがあなたの要件に非常にうまく対応し、他の多くの方法よりも優れたパフォーマンスをするだろうと思います。
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
この関数は、大文字を必要とする単語ごとに1回しかループしないため、ほとんどの場合よりも少し高速です。
以下の関数を試してください(必要に応じて文字列タイプを調整します)。 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
所属していません StackOverflow