Abfrage mit Divisor = 0;

Abfrage mit Divisor = 0;

am 10.01.2007 15:54:57 von Stephan Dreisbach

Hallo,
was passiert eigentlich, wenn in einer Abfrage u.a. nach dem Ergebnis
einer Divison gesucht wird, in einer der Datensätze aber der Divisor 0
ist, also "select * from irgendwas where a/b>4"?
Wenn ich das richtig sehe, wird sowas einfach ignoriert?
Stephan

Re: Abfrage mit Divisor = 0;

am 10.01.2007 16:07:29 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de

Re: Abfrage mit Divisor = 0;

am 10.01.2007 16:32:26 von Kai Ruhnau

Stephan Dreisbach wrote:
> was passiert eigentlich, wenn in einer Abfrage u.a. nach dem Ergebnis
> einer Divison gesucht wird, in einer der Datensätze aber der Divisor 0
> ist, also "select * from irgendwas where a/b>4"?
> Wenn ich das richtig sehe, wird sowas einfach ignoriert?

Kommt Drauf An[tm]

Über die Variable sql_mode kannst du steuern, was passiert.

Auszug aus http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html

"
ERROR_FOR_DIVISION_BY_ZERO

Produce an error in strict mode (otherwise a warning) when a division by
zero (or MOD(X,0)) occurs during an INSERT or UPDATE. If this mode is
not enabled, MySQL instead returns NULL for divisions by zero. For
INSERT IGNORE or UPDATE IGNORE, MySQL generates a warning for divisions
by zero, but the result of the operation is NULL. (Implemented in MySQL
5.0.2)
"

Bei dir wird wohl die Einstellung so sein, dass Nulldivision NULL
erzeugt, sodass a/b>4 ebenfalls zu NULL ausgewertet und als FALSE
gewertet wird. Das ist auch das Standardverhalten bis Version 5.

Grüße
Kai

--
This signature is left as an exercise for the reader.

Re: Abfrage mit Divisor = 0;

am 10.01.2007 16:49:56 von Stephan Dreisbach

Andreas Kretschmer schrieb:

[..]
>Was MySQL macht, weiß ich nicht. Warum probierst Du es nicht mal
>einfach?

Das habe ich natürlich, aber ich bekam nie eine Fehlermeldung. Ich
wollte nur wissen, ob ich was übersehen habe und meine Scripte
irgendwo Amok laufen, ohne das zu merken.

Danke
Stephan

Re: Abfrage mit Divisor = 0;

am 10.01.2007 16:50:50 von Stephan Dreisbach

Kai Ruhnau schrieb:

>Stephan Dreisbach wrote:
>> was passiert eigentlich, wenn in einer Abfrage u.a. nach dem Ergebnis
>> einer Divison gesucht wird, in einer der Datensätze aber der Divisor 0
>> ist, also "select * from irgendwas where a/b>4"?
>> Wenn ich das richtig sehe, wird sowas einfach ignoriert?
>
>Kommt Drauf An[tm]
>
>Über die Variable sql_mode kannst du steuern, was passiert.
>
>Auszug aus http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html
>
>"
>ERROR_FOR_DIVISION_BY_ZERO
>
>Produce an error in strict mode (otherwise a warning) when a division by
>zero (or MOD(X,0)) occurs during an INSERT or UPDATE. If this mode is
>not enabled, MySQL instead returns NULL for divisions by zero. For
>INSERT IGNORE or UPDATE IGNORE, MySQL generates a warning for divisions
>by zero, but the result of the operation is NULL. (Implemented in MySQL
>5.0.2)
>"
>
>Bei dir wird wohl die Einstellung so sein, dass Nulldivision NULL
>erzeugt, sodass a/b>4 ebenfalls zu NULL ausgewertet und als FALSE
>gewertet wird. Das ist auch das Standardverhalten bis Version 5.

Danke für den Hinweis.

Re: Abfrage mit Divisor = 0;

am 10.01.2007 17:13:05 von Andreas Kretschmer

Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)

Re: Abfrage mit Divisor = 0;

am 10.01.2007 17:58:51 von Michael Fesser

..oO(Andreas Kretschmer)

>Siehe Kai. Wobei ich schon sagen muß, daß ich es nicht für optimal
>halte, wenn MySQL einfach sang- und klanglos weitermacht, als sei nix
>passiert.

Das Ergebnis einer Division durch 0 ist nicht definiert, was sich auch
bei MySQL im Ergebnis widerspiegelt (NULL). Ich finde dieses Verhalten
durchaus nicht falsch, zumal es sich ja konfigurieren läßt.

Micha

Re: Abfrage mit Divisor = 0;

am 10.01.2007 18:27:20 von Andreas Kretschmer

Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)

Re: Abfrage mit Divisor = 0;

am 10.01.2007 18:42:13 von Stephan Dreisbach

Andreas Kretschmer schrieb:

[..]
>
>test=# select case when b != 0 then a/b else NULL end from foo;
> case

Doch noch eine Nachfrage: Wie baue ich das case ein, wenn ich z.B. bei
select * from Tabelle where Nr='irgendwas
and Name like 'irgendwas
and richtig/Anzahl>0.7

den Teil "and richtig/Anzahl" nur dann mit abfragen will, wenn
Anzahl >10 ist?

Danke nochmals.

Stephan

Re: Abfrage mit Divisor = 0;

am 10.01.2007 18:55:58 von Andreas Kretschmer

Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)

Re: Abfrage mit Divisor = 0;

am 10.01.2007 19:12:44 von Stephan Dreisbach

Andreas Kretschmer schrieb:

>begin Stephan Dreisbach wrote:
>> Andreas Kretschmer schrieb:
>
>> [..]
>>>
>>>test=# select case when b != 0 then a/b else NULL end from foo;
>>> case
>
>> Doch noch eine Nachfrage: Wie baue ich das case ein, wenn ich z.B. bei
>> select * from Tabelle where Nr='irgendwas
>> and Name like 'irgendwas
>> and richtig/Anzahl>0.7
>
>> den Teil "and richtig/Anzahl" nur dann mit abfragen will, wenn
>> Anzahl >10 ist?
>
>Schnellschuß, ungetestet:
>... and anzahl > 10

Klar, welch blöde Frage von mir.

Re: Abfrage mit Divisor = 0;

am 10.01.2007 19:32:43 von Stephan Dreisbach

Stephan Dreisbach schrieb:

[..]
>>> Doch noch eine Nachfrage: Wie baue ich das case ein, wenn ich z.B. bei
>>> select * from Tabelle where Nr='irgendwas
>>> and Name like 'irgendwas
>>> and richtig/Anzahl>0.7
>>
>>> den Teil "and richtig/Anzahl" nur dann mit abfragen will, wenn
>>> Anzahl >10 ist?
>>
>>Schnellschuß, ungetestet:
>>... and anzahl > 10
>
>Klar, welch blöde Frage von mir.

Ne, doch nicht so blöd, denn dann wird bei der Abfrage ja Anzahl>10
mit berücksichtigt und das will ich nicht, also so:

wenn Anzahl>10 dann
select * form ... Nr='irgendwas and richtig/Anzahl>0.7
sonst nichts
select * form ... Nr='irgendwas

oder sehe ich jetzt den Wald wirklich nicht mehr vor lauter Bäumen?

Re: Abfrage mit Divisor = 0;

am 10.01.2007 19:44:32 von Michael Fesser

..oO(Andreas Kretschmer)

>begin Michael Fesser wrote:
>
>> Das Ergebnis einer Division durch 0 ist nicht definiert, was sich auch
>> bei MySQL im Ergebnis widerspiegelt (NULL). Ich finde dieses Verhalten
>> durchaus nicht falsch, zumal es sich ja konfigurieren läßt.
>
>Man kann das durchaus so sehen, nur leider oder mit Absicht hast Du die
>Zeilen des OP bzgl. Amok-laufender Scripte entweder selbst nicht gelesen
>oder nicht verstanden.

Ich habe es gelesen und auch verstanden. Aber ohne zu wissen, was das
genau für Daten sind und wie diese von den Skripten verarbeitet werden,
ist eine Beurteilung schwierig.

>Wenn ich Daten, wie auch immer, miteinander verbinde um ein Ergebnis zu
>erhalten, sehe ich es durchaus als Fehler, wenn die Daten dazu nicht
>geeignet sind. Wenn ich will, daß eine solche Situation als okay
>durchgeht (NULL), dann will ich das selbst so definieren.

Kannst Du ja. Natürlich ist es immer erstmal einfacher, auf verkorksten
oder zumindest suboptimalen Standard-Konfigurationen rumzuhacken.

>Mir steckte gestern jemand diesen Link, und wenn ich das so lese, dann
>ist mir schon klar, das MySQL-User passend konditioniert sind:
>
>http://sunsite.univie.ac.at/textbooks/mysql/manual.html#Bro ken_Foreign_KEY

Das ist 6 Jahre alt! Was meinst Du, was ich für Geschichten über MS-DOS
5.0 und Windows 3.1 erzählen könnte. Spielt das eine Rolle? Nein.

>(okay, andere Baustelle, aber meiner Meinung nach schon eine gehörige
>Portion Frechheit, kapottes Design als gloreiche Errungenschaft
>anzupreisen...

Jeder fängt mal klein an, auch DBMS. Im Vergleich zu oben erwähnter 3.23
sind aktuelle 5.0/5.1 sehr viel erwachsener und ausgereifter. Natürlich
könnte man genausogut über PHP herziehen, wenn man alte PHP 3-Dokumente
ausgräbe.

>und klar, daß man einen 30. Februar als Datum eingeben
>kann ist dann auch okay...

Oder 1962-00-00. Böse[tm]! Aber nützlich, wenn man damit umgehen kann.

>und das Divison durch 0 nicht falsch ist...)

Ansichtssache.

Micha

Re: Abfrage mit Divisor = 0;

am 10.01.2007 19:44:52 von dnoeth

Stephan Dreisbach wrote:

> Ne, doch nicht so blöd, denn dann wird bei der Abfrage ja Anzahl>10
> mit berücksichtigt und das will ich nicht, also so:
>
> wenn Anzahl>10 dann
> select * form ... Nr='irgendwas and richtig/Anzahl>0.7
> sonst nichts
> select * form ... Nr='irgendwas
>
> oder sehe ich jetzt den Wald wirklich nicht mehr vor lauter Bäumen?

Ja.

and (Anzahl<=10 or richtig/Anzahl>0.7)

Aber auch hier musst du Division By Zero aufpassen, das der Optimizer
die Reihenfolge der Bedingungen umstellen kann.

Und statt CASE nimm lieber das einfachere NULLIF, das hat ein DBMS immer
dann wenn es auch CASE gibt:

richtig/NULLIF(Anzahl,0)

Dieter

Re: Abfrage mit Divisor = 0;

am 10.01.2007 21:01:15 von dafox

Kai Ruhnau schrieb:
> Stephan Dreisbach wrote:

>> was passiert eigentlich, wenn in einer Abfrage u.a. nach dem Ergebnis
>> einer Divison gesucht wird, in einer der Datensätze aber der Divisor 0
>> ist, also "select * from irgendwas where a/b>4"?

>> Wenn ich das richtig sehe, wird sowas einfach ignoriert?

> Auszug aus http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html

> Produce an error in strict mode (otherwise a warning) when a division by
> zero (or MOD(X,0)) occurs during an INSERT or UPDATE. If this mode is
> not enabled, MySQL instead returns NULL for divisions by zero. For
> INSERT IGNORE or UPDATE IGNORE, MySQL generates a warning for divisions
> by zero, but the result of the operation is NULL. (Implemented in MySQL
> 5.0.2)

Dem entnehme ich, dass das auf SELECT gar keinen Einfluss hat, also dem
OP an dieser Stelle leider nicht hilft.

Re: Abfrage mit Divisor = 0;

am 10.01.2007 21:20:47 von Michael Fesser

..oO(Michael Fesser)

>.oO(Andreas Kretschmer)
>
>>Wenn ich Daten, wie auch immer, miteinander verbinde um ein Ergebnis zu
>>erhalten, sehe ich es durchaus als Fehler, wenn die Daten dazu nicht
>>geeignet sind. Wenn ich will, daß eine solche Situation als okay
>>durchgeht (NULL), dann will ich das selbst so definieren.
>
>Kannst Du ja. [...]

Oder auch nicht. Die Variable 'sql_mode' scheint sich wirklich nur auf
INSERT und UPDATE auszuwirken.

Micha

Re: Abfrage mit Divisor = 0;

am 10.01.2007 23:28:29 von Kai Ruhnau

Thomas Hamacher wrote:
> Kai Ruhnau schrieb:
>> Stephan Dreisbach wrote:
>
>>> was passiert eigentlich, wenn in einer Abfrage u.a. nach dem Ergebnis
>>> einer Divison gesucht wird, in einer der Datensätze aber der Divisor 0
>>> ist, also "select * from irgendwas where a/b>4"?
>
>>> Wenn ich das richtig sehe, wird sowas einfach ignoriert?
>
>> Auszug aus http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html
>
>> Produce an error in strict mode (otherwise a warning) when a division
>> by zero (or MOD(X,0)) occurs during an INSERT or UPDATE. If this mode
>> is not enabled, MySQL instead returns NULL for divisions by zero. For
>> INSERT IGNORE or UPDATE IGNORE, MySQL generates a warning for
>> divisions by zero, but the result of the operation is NULL.
>> (Implemented in MySQL 5.0.2)
>
> Dem entnehme ich, dass das auf SELECT gar keinen Einfluss hat, also dem
> OP an dieser Stelle leider nicht hilft.

Hab' ich auch später gemerkt, da war der Artikel aber schon zu lange
draußen, als dass ich ihn zurückziehen wollte. Dann war es schon spät und...

Was ist eigentlich mit simpler Mathematik?

WHERE a>4*b AND b!=0?

Könnte den Vorteil haben, dass für a bzw. bei Umstellung für b ein Index
genutzt werden kann.

Grüße
Kai

--
This signature is left as an exercise for the reader.

Re: Abfrage mit Divisor = 0;

am 11.01.2007 11:57:21 von Claus Reibenstein

Stephan Dreisbach schrieb:

> was passiert eigentlich, wenn in einer Abfrage u.a. nach dem Ergebnis
> einer Divison gesucht wird, in einer der Datensätze aber der Divisor 0
> ist, also "select * from irgendwas where a/b>4"?

Was hältst Du von "SELECT ... WHERE a>4*b"? Da entsteht das Problem erst
gar nicht.

Gruß. Claus
--
,~°O O
O ,´ / |/|\
/ |¯`. Das neue Hochzeits-Branchenbuch im Internet ,´ / | |\
/__| `~...............................................~´ /___|/ /