![]() |
Datenbank: MySQL • Version: 5.1 • Zugriff über: ODBC/MyDAC
Frage zu IfNull bei MySQL
Hi.
ich habe hier eine Storedprocedure die im Grunde folgendes machen soll: Anhand der übergebenen Daten (bzw. anhand eines Parameters) soll in einer Tabelle der entsprechende Datensatz gesucht werden. Ist einer da, dann wird der per Update und den restlichen Parametern aktualisiert, ist keiner da, soll einer angelegt werden. Was ich nicht verstehe: Der Update läuft so ab: Update <tabelle> SET Wert1=IFNULL(Wert1,AWert1),... wobei Wert1 das Tabellenfeld ist, AWert1 der übergebene Parameter. Ziel ist es, wenn NULL übergeben werden (oder leere Strings) diese den aktuellen Inhalt nicht überschreiben sollen. Anhand der Doku von IfNull sowie meinen kurzen Tests würde das da oben aber auch bedeuten, dass wenn in Wert1 ein gültiger Wert steht niemals eine Aktualisierung (durch AWert1) durchgeführt wird, auch wenn in AWert1 ein gültiger von Wert1 unterschiedlicher Wert steht. Die Praxis zeigt aber: Es klappt. Und ich versteh nicht warum. Kann mir jemand von Euch den Hintergrund erklären? Eingesetzte MySQL: 5.1.71 Grüße |
AW: Frage zu IfNull bei MySQL
Das würde ich auch so erwarten, wenn Wert1 NULL -> AWert1 sonst Wert1. Sobald im Feld ein von NULL abweichender Wert steht, dürfte er durch ibiges Statement nicht mehr geändert werden, bzw. der Wert wird mit sich selbst ersetzt.
|
AW: Frage zu IfNull bei MySQL
SQL-Code:
NULLIF(Wert1, Wert2) = IFTHEN(Wert1 = Wert2, NULL, Wert1)
Wenn Wert1=Wert2 dann NULL und ansonsten unverändert. [edit] Halt nee, das war NullIf :oops:
SQL-Code:
IFNULL(Wert1, Wert2) = COALESCE(Wert1, Wert2) = IFTHEN(Wert1 IS NULL, Wert2, Wert1)
|
AW: Frage zu IfNull bei MySQL
Was ist falsch?
|
AW: Frage zu IfNull bei MySQL
Hab's falsche wieder reingeschrieben. :stupid:
Warum muß sowas auch immer fast gleich heißen? |
AW: Frage zu IfNull bei MySQL
SQL-Code:
Heraus kommt (wie auch nicht anders zu erwarten war):
DROP TABLE IF EXISTS foo;
CREATE TABLE foo ( id int(11) NOT NULL DEFAULT '0', Wert1 varchar(10) DEFAULT NULL, PRIMARY KEY (id) ); INSERT INTO foo ( id, Wert1 ) VALUES( 1, 'test 1' ); INSERT INTO foo ( id, Wert1 ) VALUES( 2, 'test 2' ); INSERT INTO foo ( id, Wert1 ) VALUES( 3, 'test 3' ); INSERT INTO foo ( id, Wert1 ) VALUES( 4, 'test 4' ); SET @AWert1 = NULL; UPDATE foo SET Wert1 = IFNULL( Wert1, @AWert1 ) WHERE id = 1; UPDATE foo SET Wert1 = IFNULL( @AWert1, Wert1 ) WHERE id = 2; SET @AWert1 = 'updated'; UPDATE foo SET Wert1 = IFNULL( Wert1, @AWert1 ) WHERE id = 3; UPDATE foo SET Wert1 = IFNULL( @AWert1, Wert1 ) WHERE id = 4; SELECT * FROM foo;
Zitat:
|
AW: Frage zu IfNull bei MySQL
also Sir Rufos Test funktioniert wie gewünscht. Ich werde nochmal in mich gehen und schauen was ich am Freitag getestet habe...
|
AW: Frage zu IfNull bei MySQL
IFNULL(Wert1,AWert1)
entspricht
Code:
Was Du wohl wolltest war
if wert1=null then return AWert1
else return Wert1
SQL-Code:
Gruß
IFNULL(AWert1,Wert1)
K-H |
AW: Frage zu IfNull bei MySQL
Ich würde die
![]()
SQL-Code:
COALESCE(value1,value2,value3,...)
Die Funktion liefert als Ergebnis den Parameter zurück der nicht NULL ist. Ausgewertet wird von links nach rechts. Falls alle Parameter gleich NULL sind liefert die Funktion natürlich auch NULL zurück. Coalesce() ist SQL/92 kompatibel und wird von sehr vielen Datenbanken unterstützt. Man kann so z.B. sicherstellen dass ein Feld immer einen Wert <> NULL erhält:
SQL-Code:
Sollte der Parameter @Preis als auch der alte Wert des Feld "Preis" gleich NULL sein dann greift immer noch der 3. Wert.
-- Beispiel
UPDATE foo SET Preis = COALESCE( @Preis, Preis, 0.0 ) WHERE id = 2 Irgendwie schöner und nützlicher als IFNULL(). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz