Juve: Problem bei SQL-Auswahl: leere Felder nicht mit auswählen

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

  1. 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

    1. 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

      1. 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

        1. 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

          1. 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

            1. 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

              1. 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

                1. 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

                  1. 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