Convertir le texte en PascalCase
-
10-10-2019 - |
Question
Est-il possible de convertir le texte à partir d'une colonne de table dans SQL Server à l'aide d'un PascalCase uniquement code SQL approprié?
TABLE DEFINITION
----------------------
ID int
CITTA varchar(50)
PROV varchar(50)
CAP varchar(50)
COD varchar(50)
Le champ qui contient du texte à convertir est CITTA
. Il contient toutes les valeurs de majuscules comme « ABANO TERME », « ROMA », et ainsi de suite. Les mots sont délimités par un espace.
EDIT
J'ai oublié de mentionner que certains mots ont un caractère d'accent dans ce '
. Ce caractère se trouve soit à la fin du mot ou au milieu.
EDIT 2:
Quelques bizarreries trouvées sur les résultats:
- Si j'ai un nom comme « ISOLA Bâlba » ce nom se traduit à « IsolaBalba » (affaire correct, mais l'espace manqué)
- Si j'ai un nom comme « ISOLA D'ASTI » ce sont convertis à « IsolaD'asti » (espace manqué comme avant et cas incorrect. Dans ce cas, le résultat correct est « Isola D'Asti »
pourrait vous s'il vous plaît me donner quelques conseils sur ce petit problème?
La solution
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]
Autres conseils
Je vous encourage à essayer le code que j'ai posté dans un blog il y a un certain temps. Je soupçonne que ce sera répondre à vos besoins très bien, et aussi de meilleurs résultats que la plupart des autres méthodes.
SQL Server appropriée Fonction de cas
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
Cette fonction est un peu plus rapide que la plupart parce que les boucles qu'une seule fois pour chaque mot qui exige une lettre majuscule.
Essayez la fonction ci-dessous (ajuster le type de chaîne selon le cas). Il suffit de ne pas l'utiliser dans une clause WHERE - et prendre en compte les ramifications de performance ailleurs. Le 12345678 est juste un peu arbitrairement grande valeur que vous pouvez remplacer par quelque chose de plus approprié!
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