Problem bei SQL-Auswahl: leere Felder nicht mit auswählen
Juve
- datenbank
Hallo zusammen.
Ich möchte aus einer Datenbank alle Datensätze auswählen, bei denen ein bestimmtes Feld (vom Typ Memo [MS Access]) nicht leer ist. Leider brachten die folgenden SQL-ANweisungen nicht das gewünscht Ergebnis:
SELECT * FROM antworten WHERE antwort<>'' OR antwort<>null ORDER BY spielerID
SELECT * FROM antworten WHERE NOT antwort='' OR antwort=null ORDER BY spielerID
Hoffe, die Problemstellung ist klar und jemand hat eine Idee...
Dank und Gruß,
der Juve
Hallo!
Ich möchte aus einer Datenbank alle Datensätze auswählen, bei denen ein bestimmtes Feld (vom Typ Memo [MS Access]) nicht leer ist. Leider brachten die folgenden SQL-ANweisungen nicht das gewünscht Ergebnis:
SELECT * FROM antworten WHERE antwort<>'' OR antwort<>null ORDER BY spielerID
SELECT * FROM antworten WHERE NOT antwort='' OR antwort=null ORDER BY spielerID
... und mit "is not null" ...
? & Beste Grüße
Viennamade
Hallo.
... WHERE antwort>'' ... war des Rätsels Lösung.
Aber ich hab da noch ein Problem: Wo steht der Cursor, wenn das Resultset leer ist (in Java: rs.isLast() oder rs.isAfterLast() oder irgendwas anderes)?
Dank und Gruß,
der Juve
Hi,
... WHERE antwort>'' ... war des Rätsels Lösung.
Aber ich hab da noch ein Problem: Wo steht der Cursor, wenn das Resultset leer ist (in Java: rs.isLast() oder rs.isAfterLast() oder irgendwas anderes)?
ich pruefe immer, ob die Rueckgabemenge leer ist bevor ich auf einen record zugreife. Das mache ich sprachenunabhaengig, so dass ich mir solche (esoterischen ;-) Fragen nie stellen muss.
Gruss,
Ludger
Hallo Ludger.
ich pruefe immer, ob die Rueckgabemenge leer ist bevor ich auf einen record zugreife. Das mache ich sprachenunabhaengig, so dass ich mir solche (esoterischen ;-) Fragen nie stellen muss.
Klingt vernünftig :-)
Aber wie genau machst du das? Direkt in SQL? Irgendeine Sprache muss doch benutzt werden... kann mir das leider im Moment nicht wirklich vorstellen, wie das aussehen soll (ist aber auch schon spät, sitze schon wieder seit rund zwölf Stunden an dem Projekt...)
Gruß,
der Juve
Halihallo Juve
ich pruefe immer, ob die Rueckgabemenge leer ist bevor ich auf einen record zugreife. Das mache ich sprachenunabhaengig, so dass ich mir solche (esoterischen ;-) Fragen nie stellen muss.
Klingt vernünftig :-)
Aber wie genau machst du das? Direkt in SQL?
Nein. SQL definiert die Anfrage, das ResultSet enthält die Antwort.
Ob diese leer oder gefüllt ist, ist nicht das Problem der SQL-
Anfrage, sondern wird -sinvollerweise- über das ResultSet geprüft.
Irgendeine Sprache muss doch benutzt werden...
Du benutzt Java, oder? - Dann verwendest du sinnvollerweise genau
diese Sprache :-)
kann mir das leider im Moment nicht wirklich vorstellen, wie das aussehen soll (ist aber auch schon spät, sitze schon wieder seit rund zwölf Stunden an dem Projekt...)
Dann versuche ich mich mit einem Hint:
Das ResultSet ist genau dann empty, wenn die Bedingung
ResultSet.getRecordCount()==0
wahr ist. Folglich:
if (rs.getRecordCount()==0) {
System.out.println("ResultSet empty!");
} else {
System.out.println("Records found:\n");
// Es folgt die Verarbeitung der Datensätze im rs
}
Viele Grüsse
Philipp
Hallo Philipp,
Danke für die Antwort!
Du benutzt Java, oder? - Dann verwendest du sinnvollerweise genau
diese Sprache :-)
Soweit so klar. Nur hatte Ludger vorher geschrieben:
Das mache ich sprachenunabhaengig
Da hatte ich so meine Vorstellungsprobleme mit.
Das ResultSet ist genau dann empty, wenn die Bedingung ResultSet.getRecordCount()==0 wahr ist.
Das ist natürlich etwas einfacher als die Variante, die ich mit gebastelt hatte:
if (!rs2.isBeforeFirst() && !rs2.isAfterLast()) {...}
Denn sowohl isBeforeFirst() als auch isAfterLast liefern false, wenn das ResultSet leer ist. Funktioniert auch, allerdings weiß ich nicht, ob es noch eine andere Situation gibt, in der dies zutrifft. Insofern ist getRecordCount() natürlich sinnvoller :)
Gruß,
der Juve
Halihallo Juve
Das ResultSet ist genau dann empty, wenn die Bedingung ResultSet.getRecordCount()==0 wahr ist.
Das ist natürlich etwas einfacher als die Variante, die ich mit gebastelt hatte:
und zudem ist sie im Gegensatz zu Deiner immer richtig :-)
if (!rs2.isBeforeFirst() && !rs2.isAfterLast()) {...}
Denn sowohl isBeforeFirst() als auch isAfterLast liefern false, wenn das ResultSet leer ist. Funktioniert auch, allerdings weiß ich nicht, ob es noch eine andere Situation gibt, in der dies zutrifft.
Tja, es gibt eben genau andere Situationen:
nämlich wenn du in einem RecordSet *mit* Datensätzen einen oder
mehrere MoveNext() noch vor deiner if-Abfrage durchführst. Dann
meldet deine if-Abfrage sinngemäss: ResultSet ist leer, was es
offensichtlich eben nicht ist. Durchdenke dieses Beispiel mal.
Natürlich hast du vor deiner if-Abfrage wahrscheinlich keine
MoveNext's eingebaut, dann tut deine Lösung auch.
Aaaber... Plötzlich muss ein anderer Programmierer den Source
anpassen, merkt dies nicht und schon ist das Unheil geschehen.
Es folgen mehrere Minuten der Fehlersuche und das nur, weil die
Lösung eben nicht für 100% aller Fälle funktioniert.
Viele Grüsse
Philipp
Hallo Philipp,
if (!rs2.isBeforeFirst() && !rs2.isAfterLast()) {...}
Denn sowohl isBeforeFirst() als auch isAfterLast liefern false, wenn das ResultSet leer ist. Funktioniert auch, allerdings weiß ich nicht, ob es noch eine andere Situation gibt, in der dies zutrifft.
Tja, es gibt eben genau andere Situationen: nämlich wenn du in einem RecordSet *mit* Datensätzen einen oder mehrere MoveNext() noch vor deiner if-Abfrage durchführst.
Aber wenn ein moveNext() erfolgreich durchgeführt wird, kann doch isBeforeFirst() niemals mehr true sein, oder? Der Cursor ist doch dann mindestens in der ersten Zeile (nach einem moveNext()) und somit würde der Term in der if-Abfrage nicht mehr true liefern. Sag ich jetzt mal so in meinem jugendlichen Leichtsinn...
Aber nichtsdestotrotz habe ich getRecordCount()==0 natürlich sofort eingebaut und verwende es problemlos.
Gruß,
der Juve
Halihallo Juve
Tja, es gibt eben genau andere Situationen: nämlich wenn du in einem RecordSet *mit* Datensätzen einen oder mehrere MoveNext() noch vor deiner if-Abfrage durchführst.
Aber wenn ein moveNext() erfolgreich durchgeführt wird, kann doch isBeforeFirst() niemals mehr true sein, oder? Der Cursor ist doch dann mindestens in der ersten Zeile (nach einem moveNext()) und somit würde der Term in der if-Abfrage nicht mehr true liefern. Sag ich jetzt mal so in meinem jugendlichen Leichtsinn...
Erste Folgerung ist richtig, zweite jedoch nicht.
Ja, beim moveNext() wird isBeforeFirst() false zurückliefern und
isAfterLast() bei mehr als einem Record (habe ich vorher vergessen)
ebenfalls.
Also:
if (!false && !false)
<=>
if (true && true)
<=>
true
<=>
dein Program meint, es sei ein leeres ResultSet.
Viele Grüsse
Philipp