Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Frage zu IfNull bei MySQL (https://www.delphipraxis.net/182378-frage-zu-ifnull-bei-mysql.html)

Lemmy 20. Okt 2014 14:48

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

mkinzler 20. Okt 2014 14:55

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.

himitsu 20. Okt 2014 15:16

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)

mkinzler 20. Okt 2014 15:20

AW: Frage zu IfNull bei MySQL
 
Was ist falsch?

himitsu 20. Okt 2014 15:24

AW: Frage zu IfNull bei MySQL
 
Hab's falsche wieder reingeschrieben. :stupid:

Warum muß sowas auch immer fast gleich heißen?

Sir Rufo 20. Okt 2014 15:29

AW: Frage zu IfNull bei MySQL
 
SQL-Code:
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;
Heraus kommt (wie auch nicht anders zu erwarten war):
idWert1
1test 1
2test 2
3test 3
4updated
Aus diesem Grund ist
Zitat:

Zitat von Lemmy (Beitrag 1276698)
SQL-Code:
Update <tabelle> SET Wert1=IFNULL(Wert1,AWert1),...
wobei Wert1 das Tabellenfeld ist, AWert1 der übergebene Parameter.

einfach nur falsch wenn die das tun soll, wie beschreiben und die Beobachtung passt nicht zu dem angegebenen Statement

Lemmy 20. Okt 2014 15:56

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...

p80286 20. Okt 2014 16:09

AW: Frage zu IfNull bei MySQL
 
IFNULL(Wert1,AWert1)
entspricht
Code:
if wert1=null then return AWert1
else return Wert1
Was Du wohl wolltest war
SQL-Code:
IFNULL(AWert1,Wert1)
Gruß
K-H

sx2008 21. Okt 2014 22:52

AW: Frage zu IfNull bei MySQL
 
Ich würde die Coalesce - Funktion verwenden
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:
-- Beispiel
UPDATE foo SET Preis = COALESCE( @Preis, Preis, 0.0 ) WHERE id = 2
Sollte der Parameter @Preis als auch der alte Wert des Feld "Preis" gleich NULL sein dann greift immer noch der 3. Wert.
Irgendwie schöner und nützlicher als IFNULL().


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:30 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz