Announcement

Collapse
No announcement yet.

Anfängerfrage zu Abfragen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Anfängerfrage zu Abfragen

    Hallo,

    ich arbeite mit einem Programm, in dem man sql-Abfragen benutzt, um grafische Darstellungen aus den ausgewählten Daten zu erzeugen.
    Ich frage mich nun, ob es an sql selbst oder an der Umsetzung im genannten Programm liegt, dass ich für eine Abfrage in einem Feld, in dem auch "" (NULL) stehen kann, immer

    WHERE beispielfeld<>'Beispieltext' or isnull(beispielfeld)

    statt einfach

    WHERE beispielfeld<>'Beispieltext'

    schreiben muss, weil scheinbar NULL nicht als "<>'Beispieltext'" akzeptiert wird. Wie gesagt, ich bin Anfänger, und würde gern wissen ob es an sql oder an meinem Programm liegt.

    Gruß, Yan

  • #2
    Hallo Yan,

    dieses Verhalten ist keine Eigenart deines Programms!
    Der Feldwert NULL ist ja nicht anderes als "undefiniert". Er hat keinen Inhalt, noch nicht einmal einen Datentyp - halt nicht definiert. Damit unterliegt NULL auch einer speziellen Logik. Ein Vergleich mit NULL ist immer NULL, also wieder undefiniert und wird in der Regel als FALSE interpretiert.

    Aus diesem Grund gibt es den speziellen Operator IS NULL, der ein Feld genau auf diesen undefinierten Zustand hin überprüft.

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Wie Falk schon erläutert hat ist eine Leerstring ("") was anderes wie NULL!

      Comment


      • #4
        danke für die schnelle Antwort!

        dann werde ich weiterhin mit

        WHERE beispielfeld<>'Beispieltext' or isnull(beispielfeld)

        abfragen.

        allerdings frage ich mich jetzt, warum isnull() TRUE zurückgibt, wenn man ein definiertes feld (datentyp vorhanden), in dem ein Leerstring steht, abfragt...?

        Gruß,

        Yan

        Comment


        • #5
          Ehm, soweit ich weiß ist ISNULL eine Funktion, mit der Du einen Wert zuordnen kannst, wenn das Feld NULL ist, also folgendermassen zu benutzen:

          WHERE ISNULL(beispielfeld, 'beispieltext') <> 'Beispieltext'...

          Was du meinst ist WHERE beispielfeld <> 'Beispieltext' or beispielfeld is null

          Grüße
          Julia

          Comment


          • #6
            wenn man isnull() wie du mit einem Argument benutzt, dann sucht er Datensätze, in denen der Wert des im ersten Argument angegebenen Feldes NULL ist und ersetzt diesen Wert duch den im zweiten Argument angegebenen.

            man kann isnull() auch mit nur einem Argument benutzen, dann ersetzt es eben nicht, sondern überprüft nur ob das angegebene Feld den Wert NULL hat und liefert TRUE zurück, wenn ja

            meiner Meinung nach dürfte also zwischen

            beispielfeld is null

            und

            isnull(beispielfeld)

            kein Unterschied bestehen

            Gruß,

            Yan

            Comment


            • #7
              das sollte im ersten Satz natürlich heißen: "wenn man isnull() wie du mit zwei Argumenten benutzt"...

              Gruß,

              Yan

              Comment


              • #8
                Stimmt. Man lernt doch nie aus....

                Comment


                • #9
                  Originally posted by YAN_B View Post
                  ... überprüft nur ob das angegebene Feld den Wert NULL hat und liefert TRUE zurück ...
                  Und das stimmt eben nicht:

                  Zitat:
                  Der Name dieser Funktion ist etwas mißverständlich. Angesichts der IsDate- und der IsNumeric-Funktionen könnte erwartet werden, daß sie 1 bzw. 0 zurückliefert, falls der (einzige) Parameter Null ist. Sie liefert jedoch nicht 0/1, sondern entweder den ersten oder den zweiten Parameter zurück.

                  Was dann in Deinem Fall wohl bedeutet, dass Du einen leeren String zurückgelieferst bekommst.

                  Grüße Jochen

                  Comment


                  • #10
                    Ja, wer lesen kann ist klar im Vorteil. Der Eintrag in der Hilfe führt aber leicht in die Irre.

                    Comment


                    • #11
                      jetzt bin ich verwirrt....

                      wie kommt es denn dann, dass die Abfrage mit

                      WHEN isnull(bsp)

                      mir alle Datensätze liefert, bei denen in bsp nichts eingetragen ist?
                      wenn isnull() einen Leerstring zurückliefert, dürfte das doch eigentlich nicht passieren, oder?

                      Gruß,
                      Yan

                      Comment


                      • #12
                        Originally posted by YAN_B View Post
                        jetzt bin ich verwirrt....
                        ...wenn isnull() einen Leerstring zurückliefert, dürfte das doch eigentlich nicht passieren, oder?...
                        Das kommt darauf an, wie die zugrundeliegende DB "Leerstrings" interpretiert. Beim ORACLE-Server gibt es z.B. KEINE Leerstrings. Eine Zuweisung mit '' an ein VARCHAR-Feld hat zur Folge das es auf NULL gesetzt wird. Ich kann dort einem NOT-NULL Feld auch keinen Leerstring zuweisen. Bei MySQL z.B. ist das wieder anders, hier wird sehr wohl zwischen NULL und '' unterschieden.

                        Gruß Falk
                        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                        Comment

                        Working...
                        X