Christoph: MySQL: LEAST()

Hallo,

eine komplizierte Angelegenheit: Wenn ich SELECT LEAST( 1579.00, 1579.00, NULL , 1311.67, NULL ) eingebe, bekomm ich nicht den kleinsten Wert zurück, sondern "NULL". Das ist natürlich schlecht.
Wenn ich SELECT LEAST( COALESCE( 1579.00, 0 ) , COALESCE( 1579.00, 0 ) , COALESCE( NULL , 0 ) , COALESCE( 1311.67, 0 ) , COALESCE( NULL , 0 ) ) eingebe, bekomm ich natürlich "0" als kleinsten Wert zurück, das wäre ja dann auch nicht richtig, weil eigentlich 1311.67 der kleinste richtige Wert wäre.

Gibt es jetzt noch eine Funktion bei MySQL 5, mit der ich z.B. sagen kann: Wenn "NULL" in der Funktion LEAST() drin steht, dann soll er diesen Wert nicht nehmen, aber alle Anderen?

Grüße

Christoph

  1. hi,

    Wenn ich SELECT LEAST( COALESCE( 1579.00, 0 ) , COALESCE( 1579.00, 0 ) , COALESCE( NULL , 0 ) , COALESCE( 1311.67, 0 ) , COALESCE( NULL , 0 ) ) eingebe, bekomm ich natürlich "0" als kleinsten Wert zurück, das wäre ja dann auch nicht richtig, weil eigentlich 1311.67 der kleinste richtige Wert wäre.

    Eine sehr eigenartige Definition eines Teilbereiches der Mathematik.

    Gibt es jetzt noch eine Funktion bei MySQL 5, mit der ich z.B. sagen kann: Wenn "NULL" in der Funktion LEAST() drin steht, dann soll er diesen Wert nicht nehmen, aber alle Anderen?

    Nicht das ich wüsste.
    Aber den Workaround dafür hast du ja bereits.
    Jetzt müsstest du dir nur noch einen weiteren suchen, der deine eigenartige obige Definition auch noch umsetzt.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Hi

      Nicht das ich wüsste.
      Aber den Workaround dafür hast du ja bereits.
      Jetzt müsstest du dir nur noch einen weiteren suchen, der deine eigenartige obige Definition auch noch umsetzt.

      Ja eigenartig ist sie wirklich, zumal dieser Bug mit dem NULL zurückgeben, erst in der Version 5.0.13 gefixt wurde und ich eine neuere Version habe...
      http://bugs.mysql.com/bug.php?id=12791

      Aber ich kenne mich auch nicht so richtig gut mit MySQL aus, vielleicht kann man ja in der Funktion noch eine if-Abfrage machen.

      Grüße

      Christoph

      1. hi,

        Ja eigenartig ist sie wirklich, zumal dieser Bug mit dem NULL zurückgeben, erst in der Version 5.0.13 gefixt wurde und ich eine neuere Version habe...
        http://bugs.mysql.com/bug.php?id=12791

        Ähm, Hallo?

        _Dass_ NULL zurückgegeben wird, wenn einer der Werte NULL ist, ist absolut gewollt.

        Der gefixte Bug ist, dass dies _nicht_ der Fall war - und das wurde jetzt ausgebessert.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. Ähm, Hallo?

          Ja Hallo, dachte wir hatten uns schon begrüßt...

          _Dass_ NULL zurückgegeben wird, wenn einer der Werte NULL ist, ist absolut gewollt.

          Der gefixte Bug ist, dass dies _nicht_ der Fall war - und das wurde jetzt ausgebessert.

          Ja und das ist mir auch klar, ich hatte mich nur falsch ausgedrückt. Passiert im Eifer des Gefechts, weil ich hier gerade mächtig unter enormen Druck arbeite. Richtig sollte es lauten: "... zumal dieser Bug mit dem NULL ignorieren..."

          Grüße

          Christoph

  2. Hallo,

    eine komplizierte Angelegenheit: Wenn ich SELECT LEAST( 1579.00, 1579.00, NULL , 1311.67, NULL ) eingebe, bekomm ich nicht den kleinsten Wert zurück, sondern "NULL". Das ist natürlich schlecht.

    Meine SQL Fähigkeiten sind eher rudimentär, aber:

    Man kann doch Subqueries nutzen, oder?

    Du könntest doch mit einem ersten SELECT statement alle Werte die NOT NULL sind wählen und dann aus der Ergebnisliste mit SELECT LEAST den kleinsten Wert wählen?

    1. Hi

      Meine SQL Fähigkeiten sind eher rudimentär, aber:

      Man kann doch Subqueries nutzen, oder?

      Du könntest doch mit einem ersten SELECT statement alle Werte die NOT NULL sind wählen und dann aus der Ergebnisliste mit SELECT LEAST den kleinsten Wert wählen?

      Hmmm ja wäre eine Idee, nur hol ich mir eben alle Daten aus mehreren Tabellen via LEFT JOIN und da sind eben auch NULL-Werte vorhanden.

      Christoph

      1. Hmmm ja wäre eine Idee, nur hol ich mir eben alle Daten aus mehreren Tabellen via LEFT JOIN und da sind eben auch NULL-Werte vorhanden.

        Du könntest sie gleich rausfiltern, IS_NULL sollte helfen:
        http://dev.mysql.com/doc/refman/5.1/de/comparison-operators.html

        Siechfred

        --
        Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.
        1. Du könntest sie gleich rausfiltern, IS_NULL sollte helfen:
          http://dev.mysql.com/doc/refman/5.1/de/comparison-operators.html

          Danke, aber da bekomm ich ja entweder 0 oder 1 zurück.

  3. Hi,

    Wenn ich SELECT LEAST( COALESCE( 1579.00, 0 ) , COALESCE( 1579.00, 0 ) , COALESCE( NULL , 0 ) , COALESCE( 1311.67, 0 ) , COALESCE( NULL , 0 ) ) eingebe, bekomm ich natürlich "0" als kleinsten Wert zurück

    Wenn Du die COALESCE-Werte, deren erster Wert null ist, keinen minimalen Wert haben willst, warum nimmst Du dann eine so kleine Zahl wie 0 als zweiten Wert? Ich würd dann ja eher einen möglichst großen Ersatzwert nehmen (MAX_INT oder wie auch immre das in MySQL heißt). Damit wäre jeder andere Wert kleiner und würde von LEAST bevorzugt benutzt.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. Hi,

      Wenn Du die COALESCE-Werte, deren erster Wert null ist, keinen minimalen Wert haben willst, warum nimmst Du dann eine so kleine Zahl wie 0 als zweiten Wert? Ich würd dann ja eher einen möglichst großen Ersatzwert nehmen (MAX_INT oder wie auch immre das in MySQL heißt). Damit wäre jeder andere Wert kleiner und würde von LEAST bevorzugt benutzt.

      Yeah, sehr geniale Idee, hab ich jetzt auch so gemacht. Ich habe einfach einen enorm hohen Wert genommen, so geht es ja auch :D

      Danke!

      Christoph

  4. Hallo (aufs Neue)!

    Du hast deine Frage vor einiger Zeit schon einmal gestellt. Ich bin der Meinung, dir damals geantwortet zu haben, dass dein Datenmodell weniger als gut, mehr als schlecht ;) ist. Und imho hab ich dir auch den Weg gewiesen das besser zu implementieren. Was ist daraus geworden?

    Wenn du die Tabellenstruktur aus irgendwelchen Gründen nicht umstellen kannst, so erzeuge mithilfe einer Unterabfrage (mySQL 5 untersützt das ja wohl) eine Datensatzmenge, die du mit MAX() und MIN() Aggregatsfunktionen abfragen kannst. Wenn nicht sowieso schon per se ignoriert kannst du NULL werte dann über eine WHERE klausel ausschliessen.

    Grüsse
    Frank

    1. Hi

      Du hast deine Frage vor einiger Zeit schon einmal gestellt. Ich bin der Meinung, dir damals geantwortet zu haben, dass dein Datenmodell weniger als gut, mehr als schlecht ;) ist. Und imho hab ich dir auch den Weg gewiesen das besser zu implementieren. Was ist daraus geworden?

      Wenn du die Tabellenstruktur aus irgendwelchen Gründen nicht umstellen kannst, so erzeuge mithilfe einer Unterabfrage (mySQL 5 untersützt das ja wohl) eine Datensatzmenge, die du mit MAX() und MIN() Aggregatsfunktionen abfragen kannst. Wenn nicht sowieso schon per se ignoriert kannst du NULL werte dann über eine WHERE klausel ausschliessen.

      Ich hatte es auch bearbeitet, der Fehler lag damals auch bei meiner Seite, indem ich für die Werte einen falschen Datentyp angelegt hatte. Ich hab dann DECIMAL(9,2) genommen und dann lief es perfekt und sauber.

      Das mit den Unterabfragen muss ich mir erst noch durchlesen ;)

      1. Hallo,

        dass du einen geeigneten Datentyp wie decimal(9,2) verwendest hatte ich mal vorausgesetzt. Was ich meinte, war das Design der Preise als "Spalten" anstelle von "Zeilen". Aber ich glaube, dass dieser Hinweis bei dir keine Früchte mehr schlägt. :(

        Ciao, Frank