Je veux mettre en majuscule uniquement la première lettre de chaque mot de chaque phrase dans une colonne SQL.
Par exemple, si la phrase est:
'J'aime les films'
alors j'ai besoin de la sortie:
'J'aime les films'
Requete:
declare @a varchar(15)
set @a = 'qWeRtY kEyBoArD'
select @a as [Normal text],
upper(@a) as [Uppercase text],
lower(@a) as [Lowercase text],
upper(left(@a,1)) + lower(substring(@a,2,len(@a))) as [Capitalize first letter only]
Ici, j'ai fait en majuscule, en minuscule et en majuscule la première lettre uniquement dans ma colonne (ici, je mets juste un mot au hasard).
Voici mes résultats:
Y a-t-il des possibilités de le faire?
Des possibilités d'obtenir des résultats sans utiliser la fonction définie par l'utilisateur?
J'ai besoin de la sortie Qwerty Keyboard
sql-server
sql-server-2014
Marin Mohanadas
la source
la source
Réponses:
Cela convertit d'abord la chaîne en XML en remplaçant tous les espaces par la balise vide
<X/>
. Ensuite, il détruit le XML pour obtenir un mot par ligne en utilisantnodes()
. Pour ramener les lignes à une valeur, il utilise l'for xml path
astuce.la source
for xml path
astuce pour la concaténation. Sauf si vous optez pour CLR qui serait la meilleure option si la vitesse et l'efficacité sont importantes.Dans SQL Server 2016, vous pouvez le faire avec R, par exemple
Que vous deviez ou non est une question différente:)
la source
Peut-être que je suis stupide, mais en vérifiant la requête ci-dessous que j'ai écrite par rapport à certaines des données fournies, cela semble être un peu plus efficace (selon l'indexation).
Le code est un peu stupide, mais n'y a-t-il pas un dicton selon lequel s'il a l'air stupide mais qu'il fonctionne, ce n'est pas stupide.
la source
Une autre option consiste à gérer cela via SQLCLR. Il existe même une méthode déjà disponible dans .NET qui fait cela: TextInfo.ToTitleCase (dans
System.Globalization
). Cette méthode met en majuscule la première lettre de chaque mot et met en minuscule les lettres restantes. Contrairement aux autres propositions ici, il saute également les mots qui sont en majuscules, en supposant qu'ils sont des acronymes. Bien sûr, si ce comportement est souhaité, il serait assez facile de mettre à jour l'une des suggestions T-SQL pour le faire également.Un avantage de la méthode .NET est qu'elle peut utiliser des lettres majuscules qui sont des caractères supplémentaires. Par exemple: DESERET SMALL LETTER OW a un mappage en majuscules de DESERET CAPITAL LETTER OW (les deux s'affichent sous forme de cases lorsque je les colle ici) , mais la
UPPER()
fonction ne change pas la version en minuscules en majuscules, même lorsque le classement par défaut pour la base de données actuelle est défini surLatin1_General_100_CI_AS_SC
. Cela semble cohérent avec la documentation MSDN qui ne répertorie pasUPPER
etLOWER
dans le tableau des fonctions qui se comportent différemment lors de l'utilisation d'un_SC
classement: classement et prise en charge Unicode: caractères supplémentaires .Retours (agrandis pour que vous puissiez réellement voir le caractère supplémentaire):
Vous pouvez voir la liste complète (et actuelle) des caractères en minuscules et passer en majuscules en utilisant la fonction de recherche suivante sur Unicode.org (vous pouvez voir les caractères supplémentaires en faisant défiler vers le bas jusqu'à ce que vous atteigniez le "DESERET" section, ou appuyez simplement sur Control-Fet recherchez ce mot):
http://unicode.org/cldr/utility/list-unicodeset.jsp?a=%5B%3AChanges_When_Titlecased%3DYes%3A%5D
Bien que pour être honnête, ce n'est pas un énorme avantage car il est douteux que quiconque utilise réellement l'un des caractères supplémentaires qui peuvent être placés dans le titre. Dans les deux cas, voici le code SQLCLR:
Voici la suggestion de @ MikaelEriksson - légèrement modifiée pour gérer les
NVARCHAR
données ainsi que les mots qui sont tous en majuscules (pour correspondre plus étroitement au comportement de la méthode .NET) - avec un test de cette implémentation T-SQL et de l'implémentation SQLCLR:Une autre différence de comportement est que cette implémentation T-SQL particulière ne se divise que sur les espaces, alors que la
ToTitleCase()
méthode considère la plupart des non-lettres comme des séparateurs de mots (d'où la différence de gestion de la partie "un et deux").Les deux implémentations gèrent correctement la combinaison des séquences. Chacune des lettres accentuées de "üvÜlA" est composée d'une lettre de base et d'une combinaison tréma / tréma (les deux points au-dessus de chaque lettre), et elles sont correctement converties dans l'autre cas dans les deux tests.
Enfin, un inconvénient inattendu de la version SQLCLR est qu'en proposant différents tests, j'ai trouvé un bogue dans le code .NET lié à sa gestion des lettres encerclées (qui a maintenant été signalé sur Microsoft Connect - MISE À JOUR: la connexion a été déplacé vers
/dev/null
- littéralement - donc je pourrais avoir besoin de soumettre à nouveau cela si le problème persiste). La bibliothèque .NET traite les lettres encerclées comme des séparateurs de mots, c'est pourquoi elle ne transforme pas le "ⓐDD" en "Ⓐdd" comme il se doit.FYI
Une fonction SQLCLR prédéfinie encapsulant la
TextInfo.ToTitleCase
méthode mentionnée ci-dessus est désormais disponible dans la version gratuite de SQL # (que j'ai écrite) en tant que String_ToTitleCase et String_ToTitleCase4k .😺
la source
Comme alternative à la réponse de Mikael Eriksson , vous pourriez envisager d'utiliser la gestion T-SQL propriétaire de la définition des variables dans les instructions de sélection à plusieurs lignes.
Dans SQL Server, lorsqu'une variable est définie dans le cadre d'une instruction SELECT, chaque ligne exécute une itération de la logique définie.
Les gens utilisent souvent cette méthode pour concaténer des chaînes, bien qu'elle ne soit pas prise en charge et qu'elle comporte des problèmes officiellement documentés . Le problème officiel est lié à des caractéristiques ORDER BY particulières, et nous n'en avons pas besoin ici, donc c'est peut-être une option sûre.
Ici, nous parcourons les 26 lettres de l'alphabet et les remplaçons par une version majuscule si elles sont précédées d'un espace. (Nous préparons la chaîne initialement en mettant en majuscule la première lettre et en minuscule, comme vous l'avez fait dans votre question.)
Le SQL est un peu complexe car il nécessite l'utilisation d'une table de pointage - une table de nombres - pour générer les 26 itérations de remplacement de ce qu'il fait. Vous pouvez créer une fonction définie par l'utilisateur (TVF) de table en ligne pratique pour produire cette table de nombres ou vous pouvez même utiliser une table physique.
Un inconvénient de cette option est qu'elle ne peut pas faire partie d'un TVF en ligne car elle doit impliquer la définition d'une variable. Donc, si vous vouliez appliquer cette méthode à une colonne de votre sortie, vous auriez besoin de l'envelopper dans un TVF multi-instructions ou une fonction définie par l'utilisateur scalaire.
Cependant, son plan de requête est beaucoup plus simple et il est probablement beaucoup plus rapide que la méthode XML. Vous pourriez dire que c'est aussi plus facile à comprendre (surtout si vous avez votre propre table de pointage).
(J'ai testé cela en utilisant une chaîne beaucoup plus grande et c'était environ 6 ms contre 14 ms pour la solution XML.)
Il existe un certain nombre de limitations supplémentaires avec cette solution. Tel qu'il est écrit, il suppose un classement insensible à la casse, bien que vous puissiez éliminer ce problème en spécifiant un classement ou en exécutant LCASE sur le terme de recherche, au prix de certaines performances. Il ne traite également que les lettres ASCII standard et repose sur leur placement dans le jeu de caractères , il ne ferait donc rien avec ñ.
la source
En supposant que vous ne cherchiez qu'à mettre des mots en majuscule après un espace, voici une autre façon de le faire.
la source
Peut-être pas à l'épreuve des balles, mais j'espère que c'est une contribution utile à ce fil.
la source
Voici la procédure que j'ai utilisée dans une base de données Firebird pour ce faire. Peut probablement être nettoyé beaucoup mais cela a fait le travail pour moi.
la source
Les CTE récursifs sont assez bons pour ce genre de chose.
Probablement pas particulièrement efficace pour les grandes opérations, mais permet ce type d'opération dans une instruction de sélection SQL pure:
Production:
la source
J'aime cette version. C'est simple, et peut être utilisé pour créer une fonction, il vous suffit d'avoir la bonne version de SQL Server:
la source
J'espère que cela aiderait ...
la source
Données de test
la mise en oeuvre
la source