SQL-Frage
Sam
- datenbank
1 Frank (no reg)0 Tom0 Texter mit x0 Tom0 Texter mit x
Hi!
Angenommen, ich habe eine kommaseparierte Liste von Werten, z.B.:
7,13,26,27,40,45
Und in meiner Datenbank (SQL Server) gibt es eine Spalte, die ebenfalls für jeden Datensatz eine solche kommaseparierte Liste enthält.
z.B.
id | werte
-----------------
1 | 1,2,15
2 | 13,14,37,40
3 | 5,7
Ist es nun per SQL möglich, alle Datensätze zu finden, die in dieser Spalte mit MINDESTENS EINEM Wert der Vergleichsliste übereinstimmen?
Also in meinem Bsp. oben die Datensätze id=2 (Werte 13 und 40 stimmen überein) und id=3 (Wert 7 stimmt überein).
Wie lässt sich sowas umsetzen?
LG, Sam
Hi,
Frage 1: meinst du Microsoft SQL Server?
Frage 2: meinst du, wie sich das generell umsetzen liesse oder performant?
[generell] = ohne Rücksicht auf Performance
schreib ein batch/prozedur, welche
Dein Datenmodell ist für solche Arten von Abfragen eher suboptimal. Eine Änderung des Datenmodells wäre zu empfehlen.
Ciao, Frank
Hello,
Angenommen, ich habe eine kommaseparierte Liste von Werten, z.B.:
7,13,26,27,40,45Und in meiner Datenbank (SQL Server) gibt es eine Spalte, die ebenfalls für jeden Datensatz eine solche kommaseparierte Liste enthält.
z.B.id | werte
1 | 1,2,15
2 | 13,14,37,40
3 | 5,7Ist es nun per SQL möglich, alle Datensätze zu finden, die in dieser Spalte mit MINDESTENS EINEM Wert der Vergleichsliste übereinstimmen?
Das ist eine typische Aufgabe für eine benutzerdefinierte Funktion, wenn man nicht, was besser wäre, das Datenmodell korrigieren will.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
id | werte
1 | 1,2,15
2 | 13,14,37,40
3 | 5,7
Wenn die Zahlen alle die gleiche Anzahl Ziffern hätten, wäre das mit LIKE einfach möglich. So aber wird bei der 7 auch die 37 gefunden. Wenn vor der ersten und nach der letzten Zahl auch ein Komma stehen würde, ginge es wieder leicht mit LIKE. Da dort keine Kommas stehen, müßtest Du z.B. nach (Stinganfang oder %,)Zahl(Stringende oder ,%) suchen um bei der Suche nach der 7 nur die 7 zu finden.
Hello,
id | werte
1 | 1,2,15
2 | 13,14,37,40
3 | 5,7
Wenn die Zahlen alle die gleiche Anzahl Ziffern hätten, wäre das mit LIKE einfach möglich. So aber wird bei der 7 auch die 37 gefunden. Wenn vor der ersten und nach der letzten Zahl auch ein Komma stehen würde, ginge es wieder leicht mit LIKE. Da dort keine Kommas stehen, müßtest Du z.B. nach (Stinganfang oder %,)Zahl(Stringende oder ,%) suchen um bei der Suche nach der 7 nur die 7 zu finden.
Jetzt bin ich aber gespannt, wie Du das mit LIKE ganz einfach lösen willst. Die fehlenden Kommata kannst Du doch ergänzen
concat(',',werte,',')
Aber bei den meisten SQL-Dialekten gibt es sowieso die Funktion find_in_set() oder eine gleichbedeutende. Nur damit geht es auch nicht so einfach. Man benötigt noch eine Schleife für den Suchwert oder eine Funktion, die diese beinhaltet.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Jetzt bin ich aber gespannt, wie Du das mit LIKE ganz einfach lösen willst.
Mit so vielen OR-verknüpften LIKEs wie die Vergleichsliste Werte enthält?!
Hello,
Jetzt bin ich aber gespannt, wie Du das mit LIKE ganz einfach lösen willst.
Mit so vielen OR-verknüpften LIKEs wie die Vergleichsliste Werte enthält?!
Ok, dann würde ich aber nicht LIKE sondern find_in_set() oder ersatzweise substring() benutzen. Die Arbeit der Auflösung ins ORs muss dann die API oder der arme Query-User leisten. Das ist allerdings keine SQL-, sondern eine API-/CLI-Lösung.
Wenn Sam uns Auskunft gegeben hat, um welches System es sich wirklich handelt, könnte man vielleicht eine benutzerdefinierte Funktion für ihn erzeugen.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Mit so vielen OR-verknüpften LIKEs wie die Vergleichsliste Werte enthält?!
Ich weiß aber nicht, wieviele Werte die Vergleichsliste enthält... Die Anzahl ist variabel.
Ok, dann würde ich aber nicht LIKE sondern find_in_set() oder ersatzweise substring() benutzen. Die Arbeit der Auflösung ins ORs muss dann die API oder der arme Query-User leisten. Das ist allerdings keine SQL-, sondern eine API-/CLI-Lösung.
Wenn Sam uns Auskunft gegeben hat, um welches System es sich wirklich handelt, könnte man vielleicht eine benutzerdefinierte Funktion für ihn erzeugen.
Es handelt sich um einen MS SQL Server.
Hallo,
Es handelt sich um einen MS SQL Server.
kannst Du Dein Datenmodell ändern? Das wäre, wie Frank und Tom bereits erwähnten, die bessere Idee. Das vorhandene Datenmodell verstößt gegen die 1. Normalform.
Freundliche Grüße
Vinzenz
Mit so vielen OR-verknüpften LIKEs wie die Vergleichsliste Werte enthält?!
Ich weiß aber nicht, wieviele Werte die Vergleichsliste enthält... Die Anzahl ist variabel.
Na und? Die Werte sind auch variabel, offenbar mußt Du also die Abfrage ohnehin dynamisch erzeugen.