hawkmaster: Select CASE Abfrage (MysQL)

Hallo zusammen,

Folgende Abfrage auf einem MySQL 5:

  
SELECT A.TypeID, A.Name, B.TypeID AS TestOutput  
FROM mytype A  
LEFT JOIN constraint B ON B.TypeID = A.TypeID  
GROUP BY A.TypeID  

Ausgabe:
----------------------------------
TypeID    Name        TestOutput
1         Hallo1      NULL
2         Hallo2      NULL
10        Hallo10     10
20        Hallo20     20
30        Hallo30     30

Bei der TypeID 1 und 2 steht in der Spalte TestOutput NULL da diese IDs nicht in der Tabelle constraint vorkommen.
Ich wollte mal versuchen, ob es irgendwie geht das der Output ein "false" enthält, wenn es die TypeID in "constraint" nicht gibt und ein "true" wenn es sie gibt.

Wenn ich nun versuche in diese Abfrage ein "Case" einzubauen:

  
SELECT  
   A.TypeID, A.Name,B.TypeID AS TestOutput,  
CASE  
     B.TypeID  
            WHEN NULL  
            THEN 'false'  
            ELSE 'true'  
            END AS CheckType  
            FROM  
                mytype A  
            LEFT JOIN  
                constraint B ON B.TypeID = A.TypeID  
GROUP BY A.TypeID  

Ich dachte man könnte hier vielleicht nach den NULL Werten Abfragen. Das klappt so aber nicht.

Auch mit COUNT und "Anzahl" klappt es so nicht, da es natürlich keine Spalte "Anzahl" gibt.

  
SELECT  
   A.TypeID, A.Name,COUNT(B.TypeID) AS Anzahl,  
CASE  
     B.TypeID  
            WHEN 0  
            THEN 'false'  
            ELSE 'true'  
            END AS CheckType  
            FROM  
                mytype A  
            LEFT JOIN  
                constraint B ON B.TypeID = A.TypeID  
GROUP BY A.TypeID  

Ich kann natürlich gleich nur mit "Count" arbeiten ohne CASE und nur prüfen, ob es 0 gibt oder nicht. Mich interessiert es nur, ob und wie so etwas mit CASE machbar wäre

vielen Dank und viele Grüße
hawk

  1. Hi!

    Ich dachte man könnte hier vielleicht nach den NULL Werten Abfragen. Das klappt so aber nicht.

    NULL ist ein spezieller Wert. Wenn er in einem Ausdruck auftaucht, ist dessen Ergebnis stets NULL. Da NULL im boolschen Kontext zu false evaluiert, kann man nicht auf einfache Weise positiv auf NULL testen. Es gibt neben dem Operator IS (NOT) NULL spezielle Funktionen, die NULL berücksichtigen und an ihrem Namen zu erkennen sind (ISNULL(), IFNULL(), NULLIF()) und COALESCE(). In deinem Fall kommst du mit IFNULL() zum Ziel, und das deutlich kürzer als mit CASE.

    Lo!

    1. Hi dedlfix,

      danke dir für den Hinweis.

      Das klappt soweit. Es ist allerdings so das man kein "true" und "false" als Output haben kann wie bei Case.

        
      SELECT A.TypeID, A.Name, B.TypeID AS TestOutput,  
      IFNULL(B.TypeID,'false') AS Installed  
      FROM mytype A  
      LEFT JOIN constraint B ON B.TypeID = A.TypeID  
      GROUP BY A.TypeID  
      
      

      Ausgabe:
      ---------------------------------------------------
      TypeID    Name        TestOutput  Installed
      1         Hallo1      NULL        false
      2         Hallo2      NULL        false
      10        Hallo10     10          10
      20        Hallo20     20          20
      30        Hallo30     30          30

      Aber ist auf jedenfall auch eine gute Lösung.

      1. Hi!

        Das klappt soweit. Es ist allerdings so das man kein "true" und "false" als Output haben kann wie bei Case.

        Ah, IFNULL() hat keinen eigenen Then-Zweig. Dann kannst du immerhin noch IF() nehmen und als Bedingung auf IS NULL testen.

        Lo!