MySQL: GREATEST()
Chris
- datenbank
0 Frank (no reg)0 Chris
0 Chris0 Siechfred
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
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
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?
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
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
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