weiß jemand, wie man Wörter beginnend mit Großbuchstaben von einer Zeichenkette trennt?
Beispiel:
%Vor%erwartetes Ergebnis:
%Vor%Wenn dies nicht möglich ist (oder zu lange), wäre auch eine Skalarfunktion in Ordnung.
Vielen Dank im Voraus.
Hier ist eine Funktion, die ich erstellt habe, die ähnlich wie das "Entfernen nicht alphabetischer Zeichen" ist. Wie alle Streifen nicht alphabetische Zeichen aus Zeichenfolge in SQL Server?
In diesem Fall wird eine case-sensitive Sortierung verwendet, die aktiv nach einer Nicht-Leerzeichen- / Großbuchstabe-Kombination sucht und dann die STUFF-Funktion zum Einfügen des Leerzeichens verwendet. Dies ist eine skalare UDF, daher werden einige Leute sofort sagen, dass es langsamer als andere Lösungen sein wird. Zu dieser Vorstellung, sage ich, bitte teste es. Diese Funktion verwendet keine Tabellendaten und Schleifen nur so oft wie nötig, so dass Sie wahrscheinlich sehr gute Ergebnisse erzielen.
%Vor%Nennen Sie es so:
%Vor%Wenn eine einzelne Abfrage benötigt wird, kann mit 26 REPLACE jeder Großbuchstabe wie
überprüft werden %Vor%Nicht die schönste Sache, aber es wird funktionieren.
BEARBEITEN
Nur um eine andere Funktion hinzuzufügen, um das Gleiche auf eine andere Art und Weise zu tun als die anderen Antworten.
Dieser verwendet die Möglichkeit von TSQL, um eine String-Variable zu verketten, ich musste den TOP N-Trick verwenden, um die Chars CTE-Zeilen in der richtigen Reihenfolge zu erzwingen
Erstellen Sie eine Zahlentabelle. Es gibt einige hervorragende Beiträge zu SO, die Ihnen zeigen, wie Sie dies tun können. Füllen Sie den Wert mit Werten bis zur maximalen Länge Ihrer Eingabezeichenfolge auf. Wählen Sie die Werte von 1 bis zur tatsächlichen Länge der aktuellen Eingabezeichenfolge aus. Überkreuzen Sie diese Liste von Zahlen mit der Eingabezeichenfolge. Verwenden Sie das Ergebnis zu SUBSTRING()
für jedes Zeichen. Dann können Sie entweder die resultierende Liste von Ein-Zeichen-Werten mit einer vorbelegten Tabellenwert-Variablen vergleichen oder jedes Zeichen in eine ganze Zahl mit ASCII()
konvertieren und nur auswählen diejenigen zwischen 65 ('A') und 90 ('Z'). An dieser Stelle haben Sie eine Liste, die die Position jedes Großbuchstabens in Ihrer Eingabezeichenfolge darstellt. UNION
die maximale Länge Ihrer Eingabezeichenfolge am Ende dieser Liste. Sie werden sehen, warum in nur einer Sekunde. Jetzt können Sie SUBSTRING()
Ihre Eingabevariable beginnen, beginnend mit der Zahl, die durch die Zeile N gegeben ist und eine Länge von (die durch die Zeile N + 1 gegebene Zahl) - (Die Zahl, die durch die Zeile N gegeben ist). Deshalb musst du UNION
die extra Nummer am Ende haben. Verketten Sie schließlich alle diese Teilstrings durch Leerzeichen getrennt mit dem Algorithmus Ihrer Wahl.
Tut mir leid, ich habe keine Instanz vor mir, um Code auszuprobieren. Klingt nach einer lustigen Aufgabe. Ich denke, es mit verschachtelten SELECT
-Anweisungen zu tun, wird verschachtelt und nicht wartbar; besser, es als CTEs auszulegen, IMHO.
Ich weiß, dass es bereits einige gute Antworten gibt, aber wenn Sie das Erstellen einer Funktion vermeiden möchten, können Sie auch einen rekursiven CTE verwenden. Es ist sicherlich keine saubere Art, dies zu tun, aber es funktioniert.
%Vor%Wie gesagt, das ist keine schöne Art, eine Abfrage zu schreiben, aber ich benutze solche Dinge, wenn ich nur einige Ad-hoc-Abfragen schreibe, bei denen ich der Datenbank keine neuen Artefakte hinzufügen möchte. Sie können dies auch verwenden, um Ihre Funktion als eine Inline-Tabellenwertfunktion zu erstellen, die immer ein bisschen schöner ist.
Tags und Links sql sql-server tsql