André Laugks: mySQL: ORDER BY -> NULL ans Ende

Hallo!

Wenn eine Spalte aufsteigend sortiert wird, kommt NULL an den Anfang.

NULL
1
2

Ich möchte aber NULL ans Ende haben.

1
2
NULL

Für ORDER BY scheint es auch keine Art optionalen Parameter dafür zu geben. Ein Funktion, mit der ich das "umdrehen" könnte, habe ich nicht gefunden.

Mit PHP kann ich das lösen. In Array1 alle Zeilen = NULL und in Array2 alle Zeilen != NULL. Dann Array1 an Array2 anhängen bzw. mit einander verbinden.

Ich würde es aber gern mit SQL lösen.

MfG, André Laugks

  1. Hallo,

    Ich würde es aber gern mit SQL lösen.

    probier mal
    select irgend,welche,felder,(length(sortfeld)=0) NOTNULLTEST from tabelle order by NOTNULLTEST,sortfeld;

    Ist wahrscheinlich nicht das Performancewunder, aber besser als zwei Queries wirds schon sein.

    Grüße
     Klaus

    1. Hallo!

      Hier mal die Tabelle.

      mysql> select * from sorttest;
      +----+------+
      | id | zahl |
      +----+------+
      |  1 |    0 |
      |  2 |    0 |
      |  3 |    1 |
      |  4 |    2 |
      |  5 |    5 |
      |  6 |    7 |
      |  7 |    9 |
      |  8 |   10 |
      +----+------+

      probier mal
      select irgend,welche,felder,(length(sortfeld)=0) NOTNULLTEST from tabelle order by NOTNULLTEST,sortfeld;

      Dein SQL gibt folgendes aus:

      mysql> select id, (length(zahl)=0) NOTNULLTEST from sorttest order by NOTNULLTEST,zahl;
      +----+-------------+
      | id | NOTNULLTEST |
      +----+-------------+
      |  1 |           0 |
      |  2 |           0 |
      |  3 |           0 |
      |  4 |           0 |
      |  5 |           0 |
      |  6 |           0 |
      |  7 |           0 |
      |  8 |           0 |
      +----+-------------+

      Ist wahrscheinlich nicht das Performancewunder, aber besser als zwei Queries wirds schon sein.

      Ich hatte die Tabelle in einem Zug geholt und dann die Arrays zusemmen gesetzt.:

      z.B.

      $a1 = 0;
      $a2 = 0;

      $array1 = array();
      $array2 = array();

      while()
        {
          if(is_null($erg["zahl"])) { $array1[$a1] = $erg["id"]; $a1++; }
            else { $array2[$a2] = $erg["id"]; $a2++; }
        }

      --> Dann noch Array verbinden!

      Ich habe es mal so gelöst:

      SELECT id, IF(zahl, zahl, 1000) AS sortzahl FROM sorttest ORDER BY sortzahl ASC;

      +----+----------+
      | id | sortzahl |
      +----+----------+
      |  3 |        1 |
      |  4 |        2 |
      |  5 |        5 |
      |  6 |        7 |
      |  7 |        9 |
      |  8 |       10 |
      |  1 |     1000 |
      |  2 |     1000 |
      +----+----------+

      Die 1000 wird nie erreicht. Die sortzahl soll eine Art Rangsystem ein. Die 1 ist das erste usw. Bei einem Neueintrag hat man diesen Rang noch nicht vergeben, und dann kommt NULL in die Zeile. Ok, ich könnte das schon mit 'DEFAULT 1000' angeben, aber dies finde ich nicht so toll.

      WAs mir aber so gerade einfällt, man könnte die höchste Zahl von 'zahl' holen um +1 erhöhen und dann spart man sich auch ein haufen "Arbeit".

      Das ganze ist für ein Bilder-CMS gedacht. Ein oder zwei SQL-Statements sind nicht so schlimm.

      MfG, André Laugks

      1. Hallo,

        mysql> select * from sorttest;
        +----+------+
        | id | zahl |
        +----+------+
        |  1 |    0 |
        |  2 |    0 |
        |  3 |    1 |
        |  4 |    2 |
        |  5 |    5 |
        |  6 |    7 |
        |  7 |    9 |
        |  8 |   10 |
        +----+------+

        probier mal
        select irgend,welche,felder,(length(sortfeld)=0) NOTNULLTEST from tabelle order by NOTNULLTEST,sortfeld;

        ach verd..., Du willst ja eine Zahl sortieren.
        select id, zahl, id is null as NOTNULLTEST from sorttest order by NOTNULLTEST,id,

        .......
        oder (hab ich gerade gefunden http://www.mysql.com/doc/C/o/Control_flow_functions.html)

        select id,zahl from sorttest order by IFNULL(zahl,100000);
        für Zahlen
        bzw.
        select id,zahl,textfeld from sorttest order by IFNULL(textfeld,'ZZZZZZZZ');
        für Strings.

        Warum einfach, wenn's kompliziert auch geht;-))

        Funktioniert übrigens nur, wenn das Feld nicht  NOT NULL ist, aber das ist bei Dir ja sowieso nie nicht der Fall, oder so, oder wie *g*.

        Grüße
          Klaus

    2. Sup!

      Gibt es kein NVL bei mySQL?
      Bei Oracle kann man damit NULL-Werte durch andere Sachen ersetzen, z.B. durch ZZZZZZ oder so.

      Gruesse,

      Bio

      1. Hallo!

        Gibt es kein NVL bei mySQL?
        Bei Oracle kann man damit NULL-Werte durch andere Sachen ersetzen, z.B. durch ZZZZZZ oder so.

        Jaein! Siehe meinem Beispiel, die Antwort auf Klaus Mock seine Antwort.

        MfG, André Laugks