Ich möchte nur den ersten Buchstaben jedes Wortes jedes Satzes in einer SQL-Spalte groß schreiben.
Zum Beispiel, wenn der Satz ist:
'Ich mag Filme'
dann brauche ich die ausgabe:
'Ich mag Filme'
Abfrage:
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]
Hier habe ich nur den ersten Buchstaben in meiner Spalte groß und klein geschrieben (hier habe ich nur ein zufälliges Wort eingegeben).
Hier sind meine Ergebnisse:
Gibt es dafür Möglichkeiten?
Gibt es Möglichkeiten, Ergebnisse zu erzielen, ohne eine benutzerdefinierte Funktion zu verwenden?
Ich brauche die Ausgabe Qwerty Keyboard
sql-server
sql-server-2014
Marin Mohanadas
quelle
quelle
Antworten:
Dadurch wird die Zeichenfolge zunächst in XML konvertiert, indem alle Leerzeichen durch das leere Tag ersetzt werden
<X/>
. Anschließend wird die XML-Datei zerkleinert, um mit ein Wort pro Zeile zu erhaltennodes()
. Um die Zeilen wieder auf einen Wert zu bringen, wird derfor xml path
Trick verwendet.quelle
for xml path
Trick der Verkettung zu umgehen . Es sei denn, Sie entscheiden sich für CLR. Dies ist die beste Option, wenn Geschwindigkeit und Effizienz wichtig sind.In SQL Server 2016 können Sie dies mit R tun, z
Ob Sie sollten oder nicht, ist eine andere Frage:)
quelle
Vielleicht bin ich dumm, aber wenn ich die unten stehende Abfrage mit einigen der bereitgestellten vergleiche, scheint dies ein bisschen effizienter zu sein (abhängig von der Indizierung).
Der Code ist ein bisschen dumm, aber es gibt keinen Spruch, der besagt, dass es nicht dumm ist, wenn es dumm aussieht, aber es funktioniert.
quelle
Eine andere Möglichkeit besteht darin, dies über SQLCLR zu handhaben. Es gibt sogar eine Methode, die in .NET bereits verfügbar ist: TextInfo.ToTitleCase (in
System.Globalization
). Bei dieser Methode wird der erste Buchstabe jedes Wortes in Großbuchstaben und die verbleibenden Buchstaben in Kleinbuchstaben geschrieben. Im Gegensatz zu den anderen Vorschlägen werden hier auch Wörter übersprungen, bei denen es sich um Akronyme handelt. Wenn dieses Verhalten gewünscht wird, ist es natürlich einfach genug, einen der T-SQL-Vorschläge zu aktualisieren, um dies ebenfalls zu tun.Ein Vorteil der .NET-Methode besteht darin, dass es sich bei Großbuchstaben um Zusatzzeichen handelt. Beispiel: DESERET SMALL LETTER OW enthält eine Zuordnung von DESERET CAPITAL LETTER OW in Großbuchstaben (beide werden als Kästchen angezeigt, wenn ich sie hier einfüge ) , aber die
UPPER()
Funktion ändert die Kleinbuchstabenversion nicht in Großbuchstaben, selbst wenn Die Standardkollatierung für die aktuelle Datenbank ist auf festgelegtLatin1_General_100_CI_AS_SC
. Dies scheint mit der MSDN-Dokumentation übereinzustimmen, in der Funktionen, die sich bei Verwendung einer Kollatierung anders verhalten, nicht aufgelistetUPPER
undLOWER
in der Tabelle nicht aufgeführt sind_SC
: Kollatierung und Unicode-Unterstützung: Zusatzzeichen .Rückgabe (vergrößert, damit Sie das Zusatzzeichen tatsächlich sehen können):
Mit der folgenden Suchfunktion bei Unicode.org können Sie die vollständige (und aktuelle) Liste der Kleinbuchstaben anzeigen und in Großbuchstaben ändern. Abschnitt, oder drücken Sie einfach Control-Fund suchen Sie nach diesem Wort):
http://unicode.org/cldr/utility/list-unicodeset.jsp?a=%5B%3AChanges_When_Titlecased%3DYes%3A%5D
Obwohl dies, um ehrlich zu sein, kein großer Vorteil ist, da es zweifelhaft ist, dass tatsächlich jemand einen der Zusatzcharaktere verwendet, die mit einem Titel versehen werden können. In beiden Fällen ist hier der SQLCLR-Code:
Hier ist der Vorschlag von @ MikaelEriksson - leicht modifiziert, um
NVARCHAR
Daten zu verarbeiten sowie Wörter zu überspringen, die alle in Großbuchstaben geschrieben sind (um dem Verhalten der .NET-Methode besser zu entsprechen) - zusammen mit einem Test dieser T-SQL-Implementierung und von die SQLCLR-Implementierung:Ein weiterer Unterschied im Verhalten besteht darin, dass diese spezielle T-SQL-Implementierung sich nur auf Leerzeichen aufteilt, wohingegen die
ToTitleCase()
Methode die meisten Nicht-Buchstaben als Worttrennzeichen betrachtet (daher der Unterschied in der Behandlung des "one & TWO" -Teils).Beide Implementierungen behandeln das korrekte Kombinieren von Sequenzen. Jeder der akzentuierten Buchstaben in "üvÜlA" besteht aus einem Grundbuchstaben und einer Kombination aus Diaeresis / Umlaut (die beiden Punkte über jedem Buchstaben) und wird in beiden Tests korrekt in den anderen Fall umgewandelt.
Schließlich ist ein unerwarteter Nachteil der SQLCLR-Version, dass ich bei der Entwicklung verschiedener Tests einen Fehler im .NET-Code gefunden habe, der mit der Behandlung der eingekreisten Buchstaben zusammenhängt (was jetzt der Fall war) Microsoft Connect gemeldet wurde - UPDATE: Connect war verschoben nach
/dev/null
- im wahrsten Sinne des Wortes -, daher muss ich dies möglicherweise erneut einreichen, wenn das Problem weiterhin besteht. Die .NET-Bibliothek behandelt die eingekreisten Buchstaben als Worttrennzeichen, weshalb das "ⓐDD" nicht wie gewünscht in "Ⓐdd" umgewandelt wird.Zu Ihrer Information
Eine vorgefertigte SQLCLR-Funktion, die
TextInfo.ToTitleCase
die oben erwähnte Methode kapselt, ist jetzt in der freien Version von SQL # (die ich geschrieben habe) als String_ToTitleCase verfügbar und String_ToTitleCase4k verfügbar .😺
quelle
Als Alternative zu Mikael Erikssons Antwort könnten Sie die Verwendung der proprietären T-SQL-Behandlung der Variableneinstellung in mehrzeiligen select-Anweisungen in Betracht ziehen.
Wenn in SQL Server eine Variable als Teil einer SELECT-Anweisung festgelegt wird, führt jede Zeile eine Iteration der festgelegten Logik aus.
Leute verwenden diese Methode häufig zum Verketten von Zeichenfolgen, obwohl sie nicht unterstützt wird und es gibt einige offiziell dokumentierte Probleme gibt . Das offizielle Problem bezieht sich auf bestimmte ORDER BY-Merkmale, und das brauchen wir hier nicht. Vielleicht ist es eine sichere Option.
Hier iterieren wir über die 26 Buchstaben des Alphabets und ersetzen sie durch eine Großbuchstabenversion, wenn ihnen ein Leerzeichen vorangestellt ist. (Wir bereiten die Zeichenfolge zunächst vor, indem wir den ersten Buchstaben großschreiben und den Rest in Kleinbuchstaben schreiben, wie Sie es in Ihrer Frage getan haben.)
Die SQL ist etwas komplex, da sie die Verwendung einer Tally-Tabelle - einer Tabelle mit Zahlen - erfordert, um die 26 Iterationen des Ersetzens zu generieren, die sie ausführt. Sie können eine handliche Inline-Tabellenwert-Benutzerdefinierte Funktion (TVF) erstellen, um diese Zahlentabelle zu erstellen, oder Sie können sogar eine physische Tabelle verwenden.
Ein Nachteil dieser Option ist, dass sie nicht Teil einer Inline-TVF sein kann, da eine Variable festgelegt werden muss. Wenn Sie diese Methode auf eine Spalte Ihrer Ausgabe anwenden möchten, müssen Sie sie in eine TVF-Datei mit mehreren Anweisungen oder eine skalare benutzerdefinierte Funktion umbrechen.
Der Abfrageplan ist jedoch viel einfacher und wahrscheinlich wesentlich schneller als die XML-Methode. Sie könnten argumentieren, dass es auch einfacher zu verstehen ist (insbesondere, wenn Sie eine eigene Aufzählungstabelle haben).
(Ich habe dies mit einer viel größeren Zeichenfolge getestet und es waren ungefähr 6 ms gegenüber 14 ms für die XML-Lösung.)
Es gibt eine Reihe zusätzlicher Einschränkungen bei dieser Lösung. Wie beschrieben wird eine Sortierung ohne Berücksichtigung der Groß- / Kleinschreibung vorausgesetzt. Sie können dieses Problem jedoch beheben, indem Sie eine Sortierung angeben oder LCASE für den Suchbegriff ausführen, was zu Lasten der Leistung geht. Es adressiert auch nur Standard-ASCII-Buchstaben und verlässt sich auf deren Platzierung im Zeichensatz , sodass es mit ñ nichts zu tun hätte.
quelle
Angenommen, Sie möchten nach einem Leerzeichen nur Wörter in Großbuchstaben schreiben, dann haben Sie hier eine andere Möglichkeit, dies zu tun.
quelle
Könnte nicht kugelsicher sein, aber ich hoffe, es ist ein hilfreicher Beitrag zu diesem Thread.
quelle
Im Folgenden wird die Vorgehensweise beschrieben, die ich in einer Firebird-Datenbank verwendet habe, um dies zu tun. Wahrscheinlich kann man viel aufräumen, aber es hat die Arbeit für mich erledigt.
quelle
Rekursive CTEs sind ziemlich gut für diese Art von Dingen.
Wahrscheinlich nicht besonders effizient für große Operationen, ermöglicht aber diese Art von Operation in einer reinen SQL-Select-Anweisung:
Ausgabe:
quelle
Ich mag diese Version. Es ist einfach und kann zum Erstellen einer Funktion verwendet werden. Sie müssen nur die richtige Version von SQL Server haben:
quelle
Ich hoffe würde helfen ...
quelle
Testdaten
Implementierung
quelle