Otto Normalverbraucher: MYSQL SELECT

Hallo,

SELECT * FROM lieferschein WHERE (STATUS != 'ok' AND LIEFART ='2') OR (STATUS!= 'ok' AND LIEFART = '3')

Seltsamer Weise klappt die Abfrage nur, wenn STATUS leer ist, steht da (NULL) erfolgt kein Treffer.

Ich steh total auf dem Schlauch.

PS: Die Datenbank "MariaDB Version 10.2.6" auf Win 10Pro

  1. Tach!

    Seltsamer Weise klappt die Abfrage nur, wenn STATUS leer ist, steht da (NULL) erfolgt kein Treffer.

    NULL ist ein besonderer Wert, mit dem man nicht rechnen oder vergleichen kann. Wann immer NULL einer der Werte einer Operation ist, ist das Ergebnis NULL. Und da NULL im booleschen Kontext zu false evaluiert, kann ein Test mit NULL-Werten nicht zu true werden. Für Tests mit NULL ist der spezielle Operator IS NULL oder IS NOT NULL zu verwenden. Außerdem gibt es auch Funktionen, die mit NULL-Werten umgehen können. Die heißen meist was mit NULL im Namen.

    dedlfix.

  2. Hallo

    SELECT * FROM lieferschein WHERE (STATUS != 'ok' AND LIEFART ='2') OR (STATUS!= 'ok' AND LIEFART = '3')
    

    Abgesehen von den Besonderheiten im Umgang mit NULL, auf die @dedlfix schon eingegangen ist, lässt sich der Query auch noch weiter vereinfachen. Solange du einheitlich auf den Aus- oder den Einschluss von Werten prüfen willst, kannst du IN() beziehungsweise NOT IN() für den Vergleich benutzen. Hier könntest du also die Prüfung auf andere Werte als '2' oder '3' mit LIEFART NOT IN('2', '3') (oder LIEFART NOT IN(2, 3)), falls das als Datentyp doch Zahlen sein sollten) vornehmen.

    SELECT *
    FROM lieferschein
    WHERE (STATUS != 'ok' OR STATUS IS NULL)
      AND LIEFART NOT IN('2', '3')
    

    Tschö, Auge

    --
    Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.
    Hohle Köpfe von Terry Pratchett
    1. Hallo Auge,

      LIEFART NOT IN('2', '3')

      Ich denke, da ist ein NOT zu viel.

      Rolf

      --
      sumpsi - posui - obstruxi
      1. Hallo

        LIEFART NOT IN('2', '3')

        Ich denke, da ist ein NOT zu viel.

        Öhhm, ja, Fehlinterpretation.

        SELECT *
        FROM lieferschein
        WHERE (STATUS != 'ok' OR STATUS IS NULL)
          AND LIEFART IN('2', '3')
        

        Tschö, Auge

        --
        Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.
        Hohle Köpfe von Terry Pratchett
        1. Danke!!! Löbbt!