Chris: MySQL: GREATEST()

Hallo,

bei SELECT GREATEST(10,19,NULL,0,0) bekomme ich NULL als größten Wert zurück. Das ist natürlich so nicht richtig. Normalerweise sollte es die 19 sein. Wie könnte ich jetzt MySQL klar machen, dass er entweder die NULL-Werte nicht vergleichen soll oder alle NULL-Werte = 0 sind? Hat jemand dazu eine Idee?

Grüße

Chris

  1. Du könntest COALESCE(NULL, 0) verwenden.

    Vielleicht solltest du dir einfach auch noch mal das entsprechende Kapitel  im Handbuch durchlesen, COALESCE ist direkt über GREATEST zu finden.

    Auszug:
    GREATEST() gibt NULL  zurück, sofern ein Argument NULL ist

    Allerdings frage ich mich immer noch, wozu es diese Funktion braucht?!?? Aus etwa 10 Jahren Berufserfahrung kann ich sagen, dass ich noch nie Bedarf für solch eine Funktion hatte.

    Möchtest du evendudel nicht doch eigentlich irgendetwas anderes machen?

    Gruss
    Frank

    1. Da hatten wir wohl die beiden Gedanken gleichzeitig gehabt.

      Möchtest du evendudel nicht doch eigentlich irgendetwas anderes machen?

      Hmmm nein ;) Ich muss aus ein paar Tabellen den größten Wert herausfiltern. Und da ich die Tabellen alle mit LEFT JOIN verbinde, sind eben auch einige NULL-Werte vorhanden. Ich brauche diese Funktion wirklich ;)

      Aber ich hab dann noch eine andere Frage zu LEAST, der Gegenfunktion zu GREATEST, denn LEAST sortiert bei mir noch viel viel eigenartiger...

      MySQL Version 5

      [code=sql]
      LEAST( b.actebis_preis_ek, c.also_ep, d.techdata_preis_ek, g.ingram_ep, h.bcom_ep ) AS Minwert, a.EK_zuk - LEAST( b.actebis_preis_ek, c.also_ep, d.techdata_preis_ek, g.ingram_ep, h.bcom_ep ) AS Differenz
      [/code]

      Beide haben genau die gleichen Werte, jedoch kommt bei beiden was unterschiedliches heraus.

      a.EK_zuk = 1287.00

      b.actebis_preis_ek = 1342.25
      c.also_ep = 1287.41
      d.techdata_preis_ek, = 1289.66
      g.ingram_ep = 1289.66
      h.bcom_ep = 769.00

      Minwert = 1287.41
      Differenz = 518

      Wie kann es sein, dass er beim Minwert 1287.41 rausbekommt, aber bei der Differenz, die sich aus "1287.00 - Minwert" zusammenstellt, 518?
      1287-518=769, 769.00 ist ja der kleinste Wert von Minwert.

      Wieso rechnen die unterschiedlich, auch wenn sie beide die gleichen Werte und Funktionen haben?

      1. Hi,

        also eigentlich doch. Du möchtest eigentlich mengenbasiert mit Aggregatfunktionen arbeiten. Dir wird dabei jedoch zum Verhängnis, dass du ein suboptimales Datenmodell hat, welches die Preise horizontal als Attribute abgespeichert anstatt ausreichend denormalisiert: z.b. (PreisbaresObjekt, Quelle, Preis(, Währung))

        Warum MySQL das tut, was es grad genau tut ... keine Ahnung, für mich nicht auf den ersten Blick ersichtlich.

        Kannst du nicht den Alias "Minwert" in der 2. Berechnung wiederverwenden?

        Grüsse
        Frank

  2. Ich antworte mir mal kurz selber, aber trotzdem die Frage an alle:

    Wäre die Möglichkeit elegant?

    SELECT GREATEST( COALESCE( 10, 0 ) , COALESCE( 19, 0 ) , COALESCE( NULL , 0 ) , COALESCE( 0, 0 ) , COALESCE( 0, 0 ) )

    Da bekomm ich ja 19 als größten Wert zurück.

    Grüße

    Chris

  3. bei SELECT GREATEST(10,19,NULL,0,0) bekomme ich NULL als größten Wert zurück. Das ist natürlich so nicht richtig.

    Kommt auf die MySQL-Version an:

    MySQL 5.1 (zu GREATEST): "GREATEST() gibt NULL  zurück, sofern ein Argument NULL ist."

    MySQL bis 4.1 zu GREATEST: "GREATEST() returns NULL only if all arguments are NULL."

    Wie könnte ich jetzt MySQL klar machen, dass er entweder die NULL-Werte nicht vergleichen soll oder alle NULL-Werte = 0 sind? Hat jemand dazu eine Idee?

    ISNULL?

    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.