AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Frage zu IfNull bei MySQL

Ein Thema von Lemmy · begonnen am 20. Okt 2014 · letzter Beitrag vom 21. Okt 2014
Antwort Antwort
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.366 Beiträge
 
Delphi 10.3 Rio
 
#1

Frage zu IfNull bei MySQL

  Alt 20. Okt 2014, 14:48
Datenbank: MySQL • Version: 5.1 • Zugriff über: ODBC/MyDAC
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Frage zu IfNull bei MySQL

  Alt 20. Okt 2014, 14:55
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.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#3

AW: Frage zu IfNull bei MySQL

  Alt 20. Okt 2014, 15:16
NULLIF(Wert1, Wert2) = IFTHEN(Wert1 = Wert2, NULL, Wert1)

Wenn Wert1=Wert2 dann NULL und ansonsten unverändert.


[edit]
Halt nee, das war NullIf

IFNULL(Wert1, Wert2) = COALESCE(Wert1, Wert2) = IFTHEN(Wert1 IS NULL, Wert2, Wert1)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (20. Okt 2014 um 15:21 Uhr)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Frage zu IfNull bei MySQL

  Alt 20. Okt 2014, 15:20
Was ist falsch?
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#5

AW: Frage zu IfNull bei MySQL

  Alt 20. Okt 2014, 15:24
Hab's falsche wieder reingeschrieben.

Warum muß sowas auch immer fast gleich heißen?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Frage zu IfNull bei MySQL

  Alt 20. Okt 2014, 15:29
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
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (20. Okt 2014 um 15:33 Uhr)
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.366 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Frage zu IfNull bei MySQL

  Alt 20. Okt 2014, 15:56
also Sir Rufos Test funktioniert wie gewünscht. Ich werde nochmal in mich gehen und schauen was ich am Freitag getestet habe...

Geändert von Lemmy (20. Okt 2014 um 16:20 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Frage zu IfNull bei MySQL

  Alt 20. Okt 2014, 16:09
IFNULL(Wert1,AWert1)
entspricht
Code:
if wert1=null then return AWert1
else return Wert1
Was Du wohl wolltest war IFNULL(AWert1,Wert1) Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#9

AW: Frage zu IfNull bei MySQL

  Alt 21. Okt 2014, 22:52
Ich würde die Coalesce - Funktion verwenden
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().
fork me on Github
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:35 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