calconeon: Datensätze mit NULL-Werten als letztes anzeigen

Hallo,

gibt es eine SQL-Interne Lösung für folgendes Problem?

Ich habe eine Datenbank, in der die Traditionen einer Schule gespeichert sind. Ein Teil von ihnen wird immer in einem bestimten Zeitraum stattfinden, dieser als Monatswert gespeichert.
Der andere Teil finden quasi immer oder zu keinem bestimmten Zeitpunkt statt. Diese Datensätze haben ein NULL-Wert in der Spalte Monat.

Wenn ich das ganze nun ausgebe möchte ich aber zunächst die Datensätze mit den festgelegten Monatsweten, und die restlichen sollen unten angezeigt werden.

Gibt es in MySQL irgendeine Möglichkeit, Datensätze mit bestimmten Inhalten (Monat = NULL) gesondert zu behandeln und als letztes einzuordnen?

Mir ist klar, das ganze auch mit den PHP-Array-Funktionen möglich wäre, aber mir wäre eine SQL-Lösung lieber.

Dankeschön!

  1. Hi,

    Gibt es in MySQL irgendeine Möglichkeit, Datensätze mit bestimmten Inhalten (Monat = NULL) gesondert zu behandeln und als letztes einzuordnen?

    ja, was haeltst Du von
     SORT BY
    ?

    Gruss,
    Ludger

    1. ja, was haeltst Du von
      SORT BY

      Tut mir, kenne bisher nur ORDER BY. Ich werde mich gleich mal schlau machen.

      Danke.

      1. Hi,

        Danke.

        bitte nicht danken, ich meinte
         ORDER BY
        .

        Was passiert denn bei
         ORDER BY
        mit den NULL-Werten. Kommen die vielleicht am Anfang oder Ende einer Datensatzmenge?

        Gruss,
        Ludger

        1. Klar, ich soritere bereits mit ORDER BY nach monat.

          Und dabei komen die NULL-Werte ganz nach Oben. ^^
          Und mir gefällt es aber so nicht, sondern ich will sie unten haben.

          Wenn ich jetzt die Sortierung mit DESC umdrehe, sind auch die Monate falsch sortert.

          Gibt also vlt. doch eine elagante SQL-Lösung dafür?

          1. Hi,

            Gibt also vlt. doch eine elagante SQL-Lösung dafür?

            zwei SELECT-Queries, die mittels UNION-Operator zu einer Query verbunden werden.

            SELECT
             DF_1
            FROM
             DT_1
            UNION SELECT
             DF_1
            FROM
             DT_1

            Gruss,
            Ludger

            1. SELECT
              DF_1
              FROM
              DT_1
              UNION SELECT
              DF_1
              FROM
              DT_1

              SELECT *
              FROM traditionen
              WHERE monat IS NOT NULL
              UNION
               SELECT *
               FROM traditionen
               WHERE monat IS NULL
              ORDER BY monat,name

              Ergibt wiederrum dasselbe Bild. Die leeren Monatswerte sind oben. Ein bisschen Nachhilfe brauch ich noch ^^.

              1. Ich hab grad noch ein bisschen rumgebstelt, aber ich bekomm es nicht hin.

                Wenn ich den ORDER BY-Befehl rausnehme ist alles klar, die NULL's sind hinten.

                Aber ich möchte gleichzeitig, dass das nach Mnat soritert wird, wo dieser angegeben ist. Da ich nur, nach der MySQL-Refenez: http://dev.mysql.com/doc/mysql/de/UNION.html
                die letzte Select-Anweisung sortieren kann, habe ich bisher noch keine Lösung gefunden.

                1. dumme frauen frage, warum machste nicht 2abfragen, erst alle wo es nicht leer ist und dann die leeren, die kannste dann hinten anhängen...
                  oder denkt frau zu einfach?

                  LG
                  rakkaus

                  1. Is mir doch auch klar, das es so funktioniert. Ich wollte bloß wissen, ob es eine elagantere Lösung gibt. Sieht doch viel schöner aus, wenn das in einer Abfrage ist.

                    MySQL soll ja auch PHP-unabhängig bedienbar sein, oder?

                    1. okey hab etwas für dich:

                      select Wert from test order by Wert = '', Wert;

                      sollte erst alle nicht-leeren nach alphabeth bringen und dann die leeren...

                      paßts?
                      lg
                      rakkaus

                      1. select Wert from test order by Wert = '', Wert;

                        Ich hab mal folgendes draus gemacht:

                        SELECT *
                        FROM traditionen
                        ORDER BY monat,monat=NULL,name

                        Passt aber nicht, die NULL-Datensätze sind weiterhin oben. Umgedreht passts auch nicht.
                        Fänd's wunderbar, wenn es passen würde, weil das sehr schön kurz ist.

                        Mit dem '' kam ich nicht weiter, weil die Monate Zahlenwerte sind und August der 0 entspricht. Sept. der 1 usw. Das ist so, weil das ganze nach einem Schuljahr und nicht nach einem Kalenderjahr sortiert wird. Über eine Modulo-Anweisung wird dem ganzen der wirkliche Monat entnommen.

                        Daher sind die Spalten, die keinen Monat gleich NULL.

  2. Hallo,

    also man kann je nach Datenbanksystem auf verschiedene Arten NULL-Werte während des Queries durch etwas anderes ersetzenlassen. Beispiel für MySQL (und da die Funktion standardisiert ist auch für die meisten anderen Systeme):
    SELECT ..., COALESCE(Monat, 13), ...
    Die DB verwendet aus dem Ausdruck den ersten Wert, der nicht NULL ist, also entweder den Monat oder die 13. Wenn du also nun ein ORDER BY hast und die anderen Monate 1-12 sind, stehen deine NULL-Werte am Ende. Falls du Datumsfelder hast ist die Sache natürlich etwas komplexer, aber da kann man bestimmt auch was basteln...
    http://dev.mysql.com/doc/mysql/en/Comparison_Operators.html.

    MfG
    Rouven

    --
    -------------------
    ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
    1. SELECT ..., COALESCE(Monat, 13), ...
      Die DB verwendet aus dem Ausdruck den ersten Wert, der nicht NULL ist, also entweder den Monat oder die 13. Wenn du also nun ein ORDER BY hast und die anderen Monate 1-12 sind, stehen deine NULL-Werte am Ende.

      Wäre schön, wenn es geht, aber das kannich aus einem anderen Grund nicht...

      In Monat steht nicht wirklich der Monat sondern Die Anzahl der Monate, die seit Schuljahresbeginn verstrichen sind. Erst in PHP generiere ich draus den ehcten Monat und über eine switch-Abfrage der Monatsnamen. Das ganze passiert durch Modulo. Wenn dort jetzt Monat 12 bzw. 13 ist, wird daraus August bzw. September. Is dann auch logisch.

      Daher kann ich auf diese Methode nicht zurückgreifen.

  3. yo,

    Gibt es in MySQL irgendeine Möglichkeit, Datensätze mit bestimmten Inhalten (Monat = NULL) gesondert zu behandeln und als letztes einzuordnen?

    man kann eine "pseudo-spalte" mit angeben, die letztlich nicht ausgegeben wird, sondern nur der sortierung dient. dort kann man eine funktion einsetzen, die anstelle des null wertes einen anderen gewünschten wert ersetzt und somit die sortierung der NULL werte am ende setzt.

    Ilja