SQL Wort in Teilworte zerlegen

Die wilde Inge

Lt. Commander
Registriert
Aug. 2009
Beiträge
2.041
Hallöchen,

ich brauche mal Hilfe, kriege irgendwie keinen richtigen Anfang zu Stande.

Ich habe in einer Spalte ein Wort. Kann mit einer Zahl oder einem Buchstabe beginnen, Länge maximal 32 Zeichen, Bindestriche im Wort sind möglich.

Ich möchte dieses und alle anderen Worte in der Spalte systematisch zerlegen, in dem immer der erste Buchstabe weggeschnitten wird und das Ergebnis in eine andere Spalte geschrieben wird und das so lange, bis nur noch 2 Buchstaben übrig sind.

Zur Verdeutlichung:

Spalte 1: Hallo-123
Ergebnis Spalte 2: Hallo-123, allo-123, llo-123, lo-123, o-123, -123, 123, 23



Die Ergebnisse der Schleife sollen also der Spalte 2 angehangen werden. Wenn beim Beginn der Funktion schon was in Spalte 2 steht, soll das überschrieben werden, sonst würde sich Spalte 2 bei nochmaligem Ausführen künstlich aufblähen.

Ich nehme jetzt mal an, dass ich erstmal die Länge des Wortes bestimmen muss, minus 1, um die Anzahl der Durchführungen zu kriegen, und dann brauche ich jeweils das Wort ab dem zweiten Buchstaben bis zum Ende.

Leider kriege ich keinen Anfrang.

Könnte mir irgendwer Hilfe zur Selbsthilfe geben oder fall es schon vorliegt, nehme ich auch gleich das Ergebnis :-D

MSSQL


Danke
 
  • Gefällt mir
Reaktionen: wuselsurfer
Hi. Split wird auf jeden Fall nicht funktionieren, weil es kein Trennzeichen gibt. Es läuft hier vermutlich eher auf LTRIM hinaus ...
 
selbst nicht getestet, aber ChatGPT sagt folgendes:

Ja, das ist eine Möglichkeit, wie du das Problem lösen könntest. Eine andere Möglichkeit wäre, eine Schleife zu verwenden, die solange läuft, bis das Wort in der Spalte 1 nur noch 2 Zeichen hat. Du könntest zum Beispiel die Länge des Wortes mit der LEN-Funktion in MSSQL bestimmen und dann in einer WHILE-Schleife prüfen, ob die Länge größer als 2 ist. Wenn ja, könntest du den Anfang des Wortes abschneiden und das Ergebnis in die Spalte 2 einfügen. Sobald das Wort nur noch 2 Zeichen hat, brichst du die Schleife ab.

Hier ist ein Beispiel für eine Möglichkeit, wie das in MSSQL aussehen könnte:
SQL:
declare @word varchar(32) = 'Hallo-123'

declare @result varchar(32) = ''


while len(@word) > 2

begin

    set @result = @result + @word + ', '

    set @word = substring(@word, 2, len(@word))

end


set @result = @result + @word


select @result
Dieser Code würde das Ergebnis 'Hallo-123, allo-123, llo-123, lo-123, o-123, -123, 123, 23' in der Variablen @result speichern. Du könntest dann diesen Wert in die Spalte 2 einfügen, indem du eine UPDATE-Anweisung verwendest.

Ich hoffe, das hilft dir weiter! Lass mich wissen, falls du noch Fragen hast oder weitere Hilfe benötigst.
 
Die wilde Inge schrieb:
Ich möchte dieses und alle anderen Worte in der Spalte systematisch zerlegen, in dem immer der erste Buchstabe weggeschnitten wird und das Ergebnis in eine andere Spalte geschrieben wird und das so lange, bis nur noch 2 Buchstaben übrig sind.
Das widerspricht erstmal grundsätzlich dem allgemeinen Datenbank Design.

Kannst du ein bisschen genauer erläutern was du vorhast? Möglicherweise gibts passendere Optionen.
 
  • Gefällt mir
Reaktionen: aronlad, floq0r und spcqike
@spcqike Du hast die KI gefragt wie mans macht? Und das kam als Ergebnis? Ist ja sau cool :-D
Ergänzung ()

@Iqra Im Endeffekt geht es darum, dass das angeschlossene Programm einen für mich ungünstigen Such-Syntax hat. Ich finde dort "Hallo123" nicht, wenn ich nach "123" oder "*123" suche, oder meinetwegen auch "o-123" (das Beispiel ist jetzt etwas dürftig, beschreibt das PRoblem aber ausreichend.

Die Such-Engine kann ich nicht verändern, den Suchindex aber schon.

Wenn ich ein weiteres Feld mit allen möglichen Abwandlungen (bzw Kürzungen) des Wort in ein weiteres Feld schreibe und dieses Feld dann in den Index aufnehme, klappt die Suche wieder, weil der Begriff voll getroffen wird, auch ohne dass ich mit einem führenden * arbeite.

Ich trickse also die Such-Engine aus, indem ich den Such-Index manipuliere ;-)
 
Hä? Wenn du selbst die queries schreiben kannst (wovon ich ausgehe weil du die "Suche" auf eine andere column legen kannst), dann kannst du ja auch die Suche beeinflussen. Die Einschränkung verstehe ich nicht. Schau dir mal Fulltext Search in MSSQL an.
 
  • Gefällt mir
Reaktionen: abcddcba
Macht das dann Sinn für dich? suchst du immer nur nach "Resten" des ehemaligen Begriffs, von "rechts"? Wenn ich dich richtig verstehe, kannst du mit diesem "Workaround" nicht nach "Hallo" suchen, oder?
 
Die wilde Inge schrieb:
Ich finde dort "Hallo123" nicht, wenn ich nach "123" oder "*123" suche, oder meinetwegen auch "o-123" (das Beispiel ist jetzt etwas dürftig, beschreibt das PRoblem aber ausreichend.
Grundlagen SQL -> Wildcards/Like...

Die wilde Inge schrieb:
Ich trickse also die Such-Engine aus, indem ich den Such-Index manipuliere ;-)
Nein du frickelst kaputt.
 
  • Gefällt mir
Reaktionen: Oelepoeto und mental.dIseASe
Die wilde Inge schrieb:
Die Such-Engine kann ich nicht verändern, den Suchindex aber schon.
warum kannst du nicht eine Fulltext Suche verwenden? Das ist deren einzige Aufgabe, entsprechende Tokenization und Normalization während der Indexierung, und genauso wird der Such-String dann verarbeitet, so dass die Suche gegen den Fulltext Index ausgeführt werden kann.
 
Hallo Leute, bitte zurück zum eigentlichen Thema.
Ich kann an das Produkt keine Hand anlegen, dass ist ne Webapplikation an die ich nicht rankomme. Ich kann lediglich die Datenbasis beeinflussen. Ich habe auch schon geschrieben, dass ich am Programm nichts verändern kann, das war kein Joke :D

Wildcard-Suche mit führendem Sternchen klappt nun mal nicht, daran kann ich leider nichts ändern, sonst würde ich mich hier nicht melden. Also bitte alle Ratschläge ich diese Richtung einstellen - ich kann damit in der Praxis nichts anfangen. Ich kann lediglich die zugrundeliegende Databasis dahingehend manipulieren, dass ich trotzdem den Datensitze finde, den ich suche. Und die einzige Möglichkeit ist nun mal, Abwandlungen des eigentlichen Suchbgriffs zu erstellen, die dann gefunden werden können.
Ergänzung ()

aronlad schrieb:
Grundlagen SQL -> Wildcards/Like...


Nein du frickelst kaputt.
Ich liebe ja solche selbstherrlichen Beiträge.

Mit den Grundlagen von SQL mus sich mich nicht auseiander setzen.
Ich__kann__nicht__verändern__wie__gesucht__wird.

Und kaputt mache ich auch nichts, ich füge der Tabelle 1 einzige Spalte hinzu und da steht nen 0815 String drin. Davon geht wieder die Welt noch der Index kaputt.
 
Die wilde Inge schrieb:
Wildcard-Suche mit führendem Sternchen klappt nun mal nicht,
Ich sag ja: SQL Grundlagen. * ist kein Wildcard in SQL.
Und wenn du am Quellcode nichts ändern kannst, bringt dir auch eine extra Column nix.
 
Wenn du mein ersten Post gelesen hättest, wüsstest du, dass ich im Programm durchaus festlegen kann welche Felder indexiert werden sollen. Es bringt mir also durchaus etwas.
Ich hätte gleich bemerken müssen dass du ein Troll bist, mein Fehler.
Ergänzung ()

abcddcba schrieb:
warum kannst du nicht eine Fulltext Suche verwenden? Das ist deren einzige Aufgabe, entsprechende Tokenization und Normalization während der Indexierung, und genauso wird der Such-String dann verarbeitet, so dass die Suche gegen den Fulltext Index ausgeführt werden kann.

Die Frage kann ich dir ehrlich nicht beantworten. Ich habe wie gesagt keinen Einfluss darauf wie das Programm sucht. Ich kann es nicht umstellen, Herstellervorgabe. Ein führender Platzhalter wird ignoriert. Damit finde ich "Hallo123" nicht mehr, wenn ich nach "123" suche. Ist halt so, brauchen wir uns nicht drüber unterhalten ob das sinnvoll ist oder nicht.

Ich will einfach nur Hilfe bei der Lösung meiner Fragestellung.
Hätte nie dazu schreiben sollen worum es genau geht ...
 
Auch wenn dein Szenario nicht so sinnvoll klingt, hier mein Tipp.
Erstelle eine Stored Procedure in der Datenbank. Die rufst du immer vor der eigentlichen Suche auf.
In der Procedure liest du Spalte 1 in eine Variable ein und iterierst via Substring Aufrufe wobei das Ergebnis in die Vrable geschrieben wird, solange bis nur noch 2 Zeichen übrig sind. Dann den wert in die neue Spalte reinschreiben
 
Hallihallo!
Da das Feld max. 32 Zeichen haben kann: wie wär's mit einer Frickellösung? Nicht schön, geht aber ;)

select Spalte1,
substring(Spalte1,2,32) + ', ' +
substring(Spalte1,3,32) + ', ' +
substring(Spalte1,4,32) + ', ' +
substring(Spalte1,5,32) Spalte2
from test

Mit MSSQL sollte das auch ohne Fehlermeldungen klappen, wenn der String in Spalte1 kürzer ist, als die Argumente in der Substring-Funktion.

Hier ein Screenshot aus meinem SQuirreL
1673255831170.png
 
Zurück
Oben