Tabelle mit "|" getrennten Werten -> einzelnen Wert davon abfragen

it-girl

Aktives Mitglied
Hallo zusammen,

hab da mal eine Frage...
Also ich wähle zB in meiner JComboBox den Wert "Wert2" aus. Daraus muss ich nun ein SQL-Statement zusammenbauen.
Das Problem daran ist, ich habe in meiner Tabelle sowas hier stehen:

Wert1|Wert2
Wert1|Wert2
Wert2|Wert1|Wert4
Wert1|Wert2
Wert5
Wert1|Wert2
Wert2
Wert4|Wert5
Wert2|Wert1|Wert4
Wert3|Wert5
Wert4|Wert5
Wert5

Wie kann ich das nun machen, dass es nicht nur den alleinstehenden "Wert2" beachtet, sondern auch den in zB "Wert1|Wert2"?

Ich habe diese Tabelle auch in die ComboBox eingelesen, das hat mit dem StringTokenizer ganz gut geklappt. Vielleicht geht das damit ja auch wieder andersrum?

Danke schon mal für eure Antworten.

LG it-girl
 
S

SlaterB

Gast
ich kann mir nicht mal irgendein lustige Variante ausdenken, es ist vollkommen unklar, worum es dir geht,
in einer Combobox wurde "Wert2" ausgewählt, und nun?
was könnte das mit |, mit anderen Einträgen (in der Combobox, in der Datenbank-Tabelle, in beiden?!) zu tun haben, worum geht es?

um doch noch zu raten:
möchtest du alle DB-Einträge laden, die "Wert2" enthalten?
[c]select * from x where y like '%Wert2%'[/c]
 

it-girl

Aktives Mitglied
möchtest du alle DB-Einträge laden, die "Wert2" enthalten?
[c]select * from x where y like '%Wert2%'[/c]

Ja genau, das möchte ich :) Sorry, für mich war der Sinn wohl klar und ich hab das als "selbstverständlich" angesehen...

Das sollte eigentlich auch so funktionieren, aber ich habe ein Leerzeichen in manchen Werten (das mit Wert1|Wert2 war ja nur ein Beispiel). Wie kann ich das behandeln? Das scheint nämlich noch nicht zu klappen.

@ andiv: Ja das weiß ich, aber die DB ist so vorgegeben und ich darf daran nichts ändern.
 
S

SlaterB

Gast
Leerzeichen werden genauso gesucht und gefunden, nenne doch deinen Problemfall ganz konkret,
in SQL geht gewiss noch mehr, aber eine einfache Alternative ist dann noch, alles in Java einzulesen und dort alles mögliche anzustellen
(nach | splitten, Umwandlung in Kleinbuchstaben, Leerzeichen entfernen)

oder ist das gleich ein Programm mit tausenden Einträgen, wo so etwas nicht praktisch erscheint?
 

it-girl

Aktives Mitglied
Also die Tabelle enthält im Moment 624 Einträge, es können aber im Laufe der Zeit mehr werden. Wie performant das dann wird, kann ich leider nicht einschätzen.

Der Teil, in dem ich die ComboBox auslese sieht so aus:
Java:
		ResultSet dt = null;
		List<String> ar = null; // ar, scope und lng werden in Methode getDBLNG initialisiert
		JComboBox lng = null;
		JComboBox scope = null;
		String sqlstr = "";
		if (scope.getItemCount() > 0) {
			//SCOPE enthält Werte der Art "Wert 1|Wert 2|Wert 3" und in der Box steht zB nur "Wert 2"
			sqlstr = "WHERE SCOPE LIKE '%" + scope.getSelectedItem().toString() + "%'";
		}
		// ...
		if (sqlstr != "") {
			lng.removeAllItems();
			dt = db.getDBLNG("SELECT LNG FROM TABLE " + sqlstr
					+ " GROUP BY LNG HAVING Count(LNG)>=1", ar, lng);
		} else {
			lng.removeAllItems();
		}
 
Zuletzt bearbeitet:
S

SlaterB

Gast
falls du noch auf eine Antwort von mir antwortest: Code != Beispiel welches nicht klappt wie gewünscht
 

it-girl

Aktives Mitglied
falls du noch auf eine Antwort von mir antwortest: Code != Beispiel welches nicht klappt wie gewünscht
Naja, wie schon gesagt, ich habe eine ComboBox, in der ich die Werte aus der Spalte SCOPE mit dem StringTokenizer nach "|" getrennt und eingefügt habe. Also steht in der Box:

Wert 1
Wert 2
Wert 3
Wert 4
Wert 5

von ehemals diesem in SCOPE:
Wert 1|Wert 2
Wert 1|Wert 2
Wert 2|Wert 1|Wert 4
Wert 1|Wert 2
Wert 5
Wert 1|Wert 2
Wert 2
Wert 4|Wert 5
Wert 2|Wert 1|Wert 4
Wert 3|Wert 5
Wert 4|Wert 5
Wert 5

Nun schreibe ich mir anhand der Box-Auswahl ein SQL-Statement:
Java:
sqlstr = "WHERE SCOPE LIKE '%" + scope.getSelectedItem().toString() + "%'";
"SELECT LNG FROM TABLE " + sqlstr + " GROUP BY LNG HAVING Count(LNG)>=1"

Da nun aber in '%" + scope.getSelectedItem().toString() + "%' ein Wert mit einem Leerzeichen steht, welches Probleme macht, kann die Abfrage nicht ausgeführt werden und es wird kein Wert zurückgegeben, falls in der Box kein Wert steht, der in SCOPE auch mal allein steht. ZB wenn ich "Wert 3" auswähle, bekomme ich kein Ergebnis, weil der Wert in der DB nur in Verbindung mit "Wert 5" dasteht.

Meintest du das mit Beispiel? :)
 
S

SlaterB

Gast
schau dir dieses toString() genau an, vielleicht gibts vorne oder am Ende noch zusätzliche Leerzeichen, dagegen hilft trim(),
vielleicht ist in der Mitte oder in der DB ein Tab statt eines Leerzeichens,
wenn nicht gar beim toString() komplett was anderes herauskommt als du erwartest, etwa "Klassenname@45a877"

wenn du die DB schnell neu generieren kannst, kannst du testweise _ statt Leerzeichen überall verwenden, in der ComboBox genauso,
oder vergleichbare Dinge machen,
bei mir funktioniert die Suche nach Leerzeichen, aus deinem Code und dem Beispiel kann ich nichts weiter erkennen
 
G

Gast2

Gast
SQL:
WHERE SCOPE LIKE '%somestring%'

Urgs... Das ist so ziemlich das schlechteste was du in einer Datenbank machen kannst. Wenn du eine [c]LIKE[/c] Clause mit einem Wildcard Pattern beginnst kann die Datenbank keinen Index auf der Spalte nutzen. Effektiv machst du bei JEDER Anfrage einen Full Table Scan. Das sollte dir bewusst sein. Wenn die Anwendung größer wird geht deine Performance massiv in den Keller.

Nebenbei verstehe ich nicht wieso du in einer [c]SCOPE[/c] Spalte mehrer Werte konkateniert hast. Auch das ist nicht im Sinne des (Datenbank) Erfinders. Wenn dich eh nur der erste Wert zur Anzeige interessiert sollte der auch in einer eigenen Spalte stehen.

Du solltest auf jeden Fall dir noch mal gehörig Gedanken über dein Datenbankmodell machen.

Just my 2 cents
 

it-girl

Aktives Mitglied
SQL:
WHERE SCOPE LIKE '%somestring%'

Urgs... Das ist so ziemlich das schlechteste was du in einer Datenbank machen kannst. Wenn du eine [c]LIKE[/c] Clause mit einem Wildcard Pattern beginnst kann die Datenbank keinen Index auf der Spalte nutzen. Effektiv machst du bei JEDER Anfrage einen Full Table Scan. Das sollte dir bewusst sein. Wenn die Anwendung größer wird geht deine Performance massiv in den Keller.
Habe das auch in Tutorials im Internet immer so gefunden... Wie kann ich das denn besser machen?

Nebenbei verstehe ich nicht wieso du in einer [c]SCOPE[/c] Spalte mehrer Werte konkateniert hast. Auch das ist nicht im Sinne des (Datenbank) Erfinders. Wenn dich eh nur der erste Wert zur Anzeige interessiert sollte der auch in einer eigenen Spalte stehen.

Du solltest auf jeden Fall dir noch mal gehörig Gedanken über dein Datenbankmodell machen.
Wie ich schon gesagt habe, ist die DB so vorgegeben und ich kann und darf daran nichts ändern. Der, der die DB erstellt hat, ist der Meinung, dass es besser so ist, als für alles eine eigene Tabelle zu erstellen. Ich persönlich finde es so auch grässlich, habe das auch anders gelernt. Deshalb habe ich keine Ahnung, wie ich das wieder auseinander kriege, da ich das ja noch nie machen musste und auch hoffentlich nie wieder machen muss... :autsch:
Und mein Beispiel sollte nicht heißen, dass ich "immer nur" den ersten Wert brauche. Er könnte auch an 2. oder 3. Stelle stehen, der Wert muss auf jeden Fall dabei sein - egal an welcher Stelle.

LG it-girl
 
Zuletzt bearbeitet:

it-girl

Aktives Mitglied
schau dir dieses toString() genau an, vielleicht gibts vorne oder am Ende noch zusätzliche Leerzeichen, dagegen hilft trim(),
vielleicht ist in der Mitte oder in der DB ein Tab statt eines Leerzeichens,
wenn nicht gar beim toString() komplett was anderes herauskommt als du erwartest, etwa "Klassenname@45a877"

wenn du die DB schnell neu generieren kannst, kannst du testweise _ statt Leerzeichen überall verwenden, in der ComboBox genauso,
oder vergleichbare Dinge machen,
bei mir funktioniert die Suche nach Leerzeichen, aus deinem Code und dem Beispiel kann ich nichts weiter erkennen
ich hab grad nachgeschaut, ich habe weder Tabs noch zusätzliche Leerzeichen, noch sonst irgendwas drin, was da nicht hingehört. Und ich bekomme auch kein "Klassenname@45a877" zurück, sondern wirklich den Wert der ComboBox als String,wie ich ihn ausgewählt habe, also wenn ich "Wert 2" auswähle, bekomme ich mit scope.getSelectedItem().toString() auch wieder "Wert 2" zurück.
 

ARadauer

Top Contributor
Zum Thema Performance... es kommt auf die Datenmenge drauf an. Wird sie größer muss man sich echt was überlegen. zb denormalisieren oder seperat mit zb solr indizieren und dort suchen.

Wie groß sie werden kann, bis die performance ein problem darstellt? Ich würds einfach ausprobieren...
 
S

SlaterB

Gast
> kann die Abfrage nicht ausgeführt werden und es wird kein Wert zurückgegeben
gibts eigentlich eine Fehlermeldung?

ich habe mir jetzt noch die Query angesehen, du gruppierst ja nach LNG, wo anscheinend die Werte drinstehen,
dir ist bewußt dass da jede Kombination für sich einzeln gezählt wird, wenn du etwa nach Wert 3 suchst und in der DB
Wert 3|Wert 5
sowie
Wert 3
steht, dann gibt es das jeweils nur einmal, beide kommen nicht durch die Bedingung "HAVING Count(LNG)>=1" durch, hast du das bedacht?
vielleicht einfach nur count(*) zählen wenn dich die Anzahl aller Einträge mit 'Wert 3' drin interessiert

allein hinsichtlich LIKE mit Leerzeichen:
generell solltest du erstmal einfacher arbeiten, ohne GROUP BY, am besten auch ohne ComboBox, funktioniert die Query
[sql]SELECT * FROM TABLE WHERE SCOPE LIKE '%Wert 3%'[/sql]
?
liefert sie keine Ergebnisse oder genau die richtigen?
 

Michael...

Top Contributor
Grundsätzlich hiflt bei solchen Problemen:
1. Das SQL Statement auf der Konsole oder sonst wo ausgeben.
2. Schaut es korrekt aus, dann das Statement direkt auf der Datenbank ausführen.
3. Funktioniert es nicht oder kommt ein falsches Ergebnis. Das Statement in der DB Umgebung solange korrigiern bis es wie gewünscht läuft.
4. Das funktionierende Statement ins Java Programm übertragen.
 

it-girl

Aktives Mitglied
Kommando zurück, ich habe den "Fehler" gefunden... Zu der Abfrage, die ich gemacht habe, gab es wirklich kein Ergebnis. Habe das nun von Hand in der DB nachgeschaut.

Also mit dem
Code:
SELECT * FROM TABLE WHERE SCOPE LIKE '%Wert 3%';
klappt :)

Danke euch! :)

LG it-girl
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Ich möchte dass ich nachdem man den Kommentar geschrieben hat den Kommentar in den Tabelle Bestellübersicht geschbeichert wird klappt nicht bei mir Datenbankprogrammierung 2
D Tabelle an Persistenzeinheit binden Datenbankprogrammierung 1
T Datenbank: Tabelle erstellen bei Web-Applikation Datenbankprogrammierung 4
S gesamte Tabelle löschen Datenbankprogrammierung 2
Zrebna Wie mittels Hibernate eine Join-Tabelle als eigene Java-Klasse erstellen? Datenbankprogrammierung 5
N Oracle SQL - Nächst kleineren Namen2 zu einem Namen aus einer Tabelle Datenbankprogrammierung 3
Kirby.exe Eine Tabelle updaten Datenbankprogrammierung 16
L SQL Tabelle Datenbankprogrammierung 11
L SQL Datenbank Tabelle insert Datenbankprogrammierung 7
L SQL Datenbank Tabelle erstellen Datenbankprogrammierung 6
B Wie kopieren ich eine Spalte von einer Tabelle in eine andere Tabelle SQLite durch java code? Datenbankprogrammierung 26
J Oracle Datenbank-Tabelle per Combobox (oder ähnliches) auswählen Datenbankprogrammierung 3
P Derby/JavaDB Datenbanktabelle erweitern, ohne Tabelle zu ändern Datenbankprogrammierung 6
B Datenmodell für Regeln + Bedingungen & Referenz auf andere Tabelle Datenbankprogrammierung 12
S FilterSearch Tabelle Datenbankprogrammierung 4
J Aufbau meiner Datenbank/Tabelle - Verbessern? So lassen? Datenbankprogrammierung 39
Dimax MySQL 10 höchsten Werte aus einer Tabelle ermitteln Datenbankprogrammierung 30
L Java- Zähle alle Werte aus der Tabelle von aktiver Zelle Datenbankprogrammierung 12
B Tabelle für "wiederkehrende Rechnungen" Datenbankprogrammierung 12
P JSP - Daten aus 2 Tabellen in eine neue Tabelle einfügen Datenbankprogrammierung 1
Thallius MySQL Tabelle splitten aber wie eine abfragen? Datenbankprogrammierung 10
D MySQL Suche nach Max Value in einer Tabelle Datenbankprogrammierung 7
RowdyN SQLite Einfache Abfrage mit temporäre Tabelle, die nur innerhalb der Abfrage gültig ist Datenbankprogrammierung 0
N Dynamische Tabelle Datenbankprogrammierung 84
T Zeitraum aus SQL-Tabelle Datenbankprogrammierung 3
V SQLite 2 Tabelle vergleichen und alle unterschiede rausgeben Datenbankprogrammierung 1
D UCanAccess / MS Access - Tabelle / Spalte vorhanden Datenbankprogrammierung 3
M MySQL wie Listen oder arras in Tabelle(n) schreiben Datenbankprogrammierung 10
Paul15 Tabelle vergleichen Datenbankprogrammierung 15
J Tabelle synchronisieren mit Datenbank Datenbankprogrammierung 7
E Wie kann man bestimmte Zeilen der Tabelle rot markieren? Datenbankprogrammierung 1
L Tabelle mit Inhalt füllen Datenbankprogrammierung 2
J Optimierung von Querys/ ausgegebene Tabelle mit in neue Anfrage einbinden Datenbankprogrammierung 2
M Derby/JavaDB Kleine DB mit Tabelle erweitern - Integrität - Alter-Table - Netbeans ... Datenbankprogrammierung 5
C Tabelle erstellen mit Apache JDBC-Util Datenbankprogrammierung 1
A MySQL Tabelle ID abfragen und Spalte ausgeben Datenbankprogrammierung 4
S Update Tabelle aus Textfeld Datenbankprogrammierung 2
A MySQL Problem bei Tabelle ausgeben Datenbankprogrammierung 3
E Nur der letzte Datensatz wird in Tabelle geschrieben Datenbankprogrammierung 4
B Nur 99% der Datensätze werden in Tabelle geschrieben Datenbankprogrammierung 2
Joew0815 Datenmerge große Tabelle Datenbankprogrammierung 16
R MySQL Blob aus DB auslesen und einer Tabelle ausgeben Datenbankprogrammierung 7
P Neue Tabelle dazugekommen Datenbankprogrammierung 1
C H2 Syntax fehler beim erstellen einer Tabelle Datenbankprogrammierung 4
J Normalisierung - Aufspaltung der Tabelle Datenbankprogrammierung 4
V HSQLDB Insert in eine Tabelle mit Autoincrement Datenbankprogrammierung 2
S Wie muss meine SQL Tabelle aufgebaut sein, um unendliche Attribute zu vermeiden Datenbankprogrammierung 2
R HSQLDB Tabelle in JTable übertragen Datenbankprogrammierung 3
S MySQL Einfügen in Tabelle nur von Programm zulassen Datenbankprogrammierung 7
S Oracle Database 11g , eclipse , Tabelle erstellen Datenbankprogrammierung 2
L MySQL Uhrzeit-Format innerhalb einer Tabelle Datenbankprogrammierung 8
E Abfrage nach existierender SQL-Tabelle Datenbankprogrammierung 7
M Designfrage zu Rows die sich auf einen Datensatz derselben Tabelle beziehen Datenbankprogrammierung 7
N Temporäre tabelle MySQL Datenbankprogrammierung 2
X MySQL Hibernate: Massenupdate auf unbekannte Tabelle Datenbankprogrammierung 4
D DB Tabelle in JTable anzeigen - Probleme Datenbankprogrammierung 8
Rudolf MySQL MySQL Tabelle mit Fremdschlüsseln in JTable darstellen Datenbankprogrammierung 5
Kenan89 Oracle Daten einer Tabelle in Array speichern Oracle Datenbankprogrammierung 10
L SQLite Daten werden nicht in die Tabelle eingefügt Datenbankprogrammierung 7
D JPA (Hibernate) : Tabelle zweimal joinen Datenbankprogrammierung 4
G Oracle Hibernate M:N-Beziehung mit nur einer vorhandenen Tabelle Datenbankprogrammierung 5
N [XLS]Strings in Excel-Tabelle schreiben (poi) Datenbankprogrammierung 2
M DB View in Tabelle konvertieren in DB2? Datenbankprogrammierung 2
N Einzelne Spalte in MySQL-DB-Tabelle schreiben Datenbankprogrammierung 7
D Probleme bei der Erzeugung einer Tabelle Datenbankprogrammierung 15
I Derby/JavaDB Problem mit Befüllung von Tabelle Datenbankprogrammierung 7
H MySQL Tabelle "Table" programmieren Datenbankprogrammierung 2
S Problem beim Anlegen einer Tabelle Datenbankprogrammierung 5
L Derby/JavaDB Fehler beim Erstellen einer Tabelle Datenbankprogrammierung 2
A Wie Tabelle auf bestimmten Inhalt überprüfen? Datenbankprogrammierung 7
G SQLite Abfrage, ob in Tabelle X Spalte Y existiert Datenbankprogrammierung 4
Y Tabelle (elegant) importieren Datenbankprogrammierung 4
turmaline [Hibernate] @OneToMany - Eine referenzierte Tabelle abfragen Datenbankprogrammierung 11
T Update an SQL Tabelle ?! Datenbankprogrammierung 10
F Baumstruktur erstellen und Art Tabelle festhalten!? Datenbankprogrammierung 13
S JPA: Objekt in Tabelle mit Composite Keys mappen (Embeddable Annotation) Datenbankprogrammierung 2
A Tabelle aktuell halten Datenbankprogrammierung 5
trash SQL, ganze Tabelle abfragen Datenbankprogrammierung 3
F HSQLDB HSQLDB lässt mich nicht auf erstellte Tabelle zugreifen Datenbankprogrammierung 12
Airwolf89 Spaltennamen einer Tabelle zurückgeben lassen Datenbankprogrammierung 9
J Ausgewählte Datensätze in DB-Tabelle schreiben Datenbankprogrammierung 13
J zufällige Auswahl aus einer Tabelle Datenbankprogrammierung 4
O eine Tabelle hat mehrere PrimKey mit dem selben Wert Datenbankprogrammierung 9
M Ausgabe in Tabelle der MySQL-Datenbank mit Java Datenbankprogrammierung 4
J Tabelle auslesen- knifflig Datenbankprogrammierung 7
Z [ORACLE] Ausgabe Tabelle im GUI Datenbankprogrammierung 4
S Daten einer Tabelle vergleichen und ggs neuen Wert einfügen Datenbankprogrammierung 8
R Tabelle Updaten aber auch Speichern Datenbankprogrammierung 2
D MySql Tabelle mit MySQLAdministrator (Anfänger) Datenbankprogrammierung 5
M Spaltennamen einer MS Access Tabelle ermitteln Datenbankprogrammierung 3
B Suche Query um genau einen Wert einer def. Gruppe aus einer Tabelle zu erhalten. Datenbankprogrammierung 2
C Prüfen, ob eine MySQL-Tabelle bereits existiert Datenbankprogrammierung 7
M Tabelle in Access Datei mit JDBC generieren Datenbankprogrammierung 3
G Tabelle für Zeitraum sperren Datenbankprogrammierung 4
G DB Modellierung mit variablen Attributen in der Tabelle Datenbankprogrammierung 4
S Datenbank-Tabelle in SWING/AWT ausgeben Datenbankprogrammierung 28
K Tabelle mit resultset refreshen? Datenbankprogrammierung 4
B Doppelte Zeilen einer Doppelten Spalte aus einer Tabelle entfernen. Datenbankprogrammierung 2
V Delete From Tabelle, ohne vorher die Tabelle zu kennen Datenbankprogrammierung 5
MQue größte id in einer Tabelle abfragen Datenbankprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben