SQL Teilstring auslesen und in andere Spalte schreiben

Die wilde Inge

Commander
Registriert
Aug. 2009
Beiträge
2.099
Hallo,

ich habe mal folgendes Problem. Ich habe schon etliche Seiten durch aber ich finde nicht die Funktion welche ich brauche.

In einer Tabelle steht im Feld Notiz:

blabla
Verändert durch: Nachname
blabla

Ich würden gerne den Nachname auslesen und dann in eine anderes Feld in der gleichen Tabelle schreiben.
Der Nachname ist natürlich immer irgendein anderer.

Ich stelle mich aktuell etwas dämlich an überhaupt erstmal nur den String nach dem "Verändert durch:" auszulesen :-D
Jemand eine Idee wie man das am geschicktesten anstellt?
Ansonsten hätte ich überlegt die ganze Zeile auszulesen und später dann "Verändert durch:" wieder rauszulöschen, wenn ich es erstmal eigenständig habe, aber das geht sicherlich eleganter.
In dem Notizfeld können übrigens noch andere Infos drin stehen. Einfach die Zeichenfolge abzählen geht also nicht.

Danke für eure Hilfe!
 
Das kommt auf den SQL Interpreter/Server an den du nutzt:
Für TSQL/SQL Server ist STRING_SPLIT ein Kandidat, oder du baust es dir selber mit CHARINDEX.
Das Hauptproblem ist eher das Ende vom Nachnamen zu finden, wenn also der 2. blabla Teil nicht irgendwelche identifizierbaren Zeichenketten drin hast, dürfte das echt nervig werden.
 
Ich denke du suchst SUBSTRING oder RIGHT. Das könnte zB so aussehen:

Code:
RIGHT(notiz, len(notiz)-17)
Die 17 sind die Zeichen auf der linken Seite, die gewissermaßen gelöscht werden sollen, also "Verändert durch: ".

Wenn "Verändert durch: " nicht fix ist, musst du die entsprechende Stelle für den Split eben suchen, zB mit CHARINDEX und darüber dann zB ":" suchen und bei SUBSTRING als Startindex verwenden.
 
  • Gefällt mir
Reaktionen: Andre As
Hi,
also erstmal danke für die Tipps.
Ich habe es mit Charindex, Right und Substring hinbekommen das Wort zu isolieren.

Ziel war es das Wort dann in ein anderes Feld zu schreiben.

Das klappt aber nur solange, wie ich nur einen einzigen Datensatz in der Tabelle haben :-D

Code:
Msg 512, Level 16, State 1, Line 17
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
Msg 512, Level 16, State 1, Line 24
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

Ich hatte ad hoc die Idee den Code in eine Zählschleife zu packen, aber das ist natürlich Unsinn, weil ich somit den Code ja nur x-mal aufrufe und x-mal die gleiche Fehlermeldung erhalte.

In Zeile 17 nutze ich Charindex, in Zeile 24 Right.

Das ganze sieht aktuell so aus, dass ich das Ergebnis von Charindex (=Position des ersten Buchstaben des gesuchten Wortes) in eine Variable1 schreibe und dann alles hinter dem Wort wegschneide -> Variable2

Und Variable 2 schreibe ich dann in der Feld.

Nur leider macht er mein set @variable1 = (select charindex usw. where 'Wort gefunden'); entsprechend der Anzahl der Treffer und dann habe ich nicht 1 Variable sondern 90.

Wie kann ich die Prozedur so kapseln, dass er alle 3 Befehle erstmal pro Zeile macht und nicht jeden Einzelbefehl direkt auf alle Zeilen bezieht?

Danke!
 
Zuletzt bearbeitet:
Nun... es fehlt der Code um dir hier genaue Details nennen zu können, aber deine Beschreibung hört sich schon unnötig umständlich an.

Du brauchst dafür keine Stored Procedure oder Programm-Code eines externen Programms um das zu bewerkstelligen.
Das geht in einem einfachen SQL, bei dem du einfach nur die Kritereien im Where-Clause entsprechend vorgeben musst.

Ein einfaches Beispiel:
SQL:
update tablename
set sirname = substring(charindex(':', changeuser) + 2, changeuser, len(changeuser))
where sirname is null
 
Hallo,

da habe ich mich wohl falsch ausgedrückt. Ich habe das alles mit SQL gemacht, keine externen Programme o.ä. genutzt/eingebunden/whatever.

Das Problem ist, dass das Wort, welches ich suche, in einem Text unbekannter länge steht, an unbekannter Position.

Also suche ich mit CHARINDEX den Beginn einer festgelegten Wortfolge (ist immer die gleiche) und speichere diese Zahl in eine Variable + X (X= Anzahl der Zeichen der Wortfolge vor dem gesuchten Wort, die ich ebenfalls nicht brauche).
Danach sage ich ihm per RIGHT, dass er alles vor Variable + X abschneiden soll und speichere das Ergebnis wieder in einer Variable. Am Ende nutze ich SUBSTRING um den restlichen Text in meiner Variable einzukürzen, bis ich nur noch das Wort habe welches ich brauche. Die Wörter sind zwar immer andere, aber die Länge ist immer die selbe.
Ansonsten ginge wohl auch SPLIT um den String am ersten Leerzeichen abzuschneiden, aber die SPLIT Funktion gibt es in SQL 2012 noch nicht.
Auch Schritt 3 wird wieder in eine Variable geschrieben in der dann nur noch das Wort drin steht.

Und dieser Wert soll dann in eine bestimmte Spalte geschrieben werden.

Das funktioniert so auch alles, aber nur wenn man in der ganzen Tabelle nur exakt 1 Treffer hat.

Findet er die gesuchte Wortfolge (Schritte1) mehr als einmal, bricht er sofort ab, da er nicht X Ergebnisse in eine Variable speichern kann.
Anders gesagt: Ich versuche mit 100en Ergebnissen auf einmal zu rechnen und das geht natürlich nicht.

Die Lösung auf meine letzte Frage war, meinen Code in eine Skalar-Wert-Funktion ("scalar-valued function") zu packen und dann diese Funktion zeilenweise arbeiten zu lassen.

Mein Code war richtig, nur die Umsetzung hatte einen Denkfehler.


Jetzt geht alles.

Danke für die Denkanstöße!
 
Zurück
Oben