Upresnit podm. WHERE

Michal Kubecek mike na mk-sys.cz
Pondělí Srpen 19 19:26:58 CEST 2002


On Mon, Aug 19, 2002 at 06:37:23PM +0200, Tomas Valousek wrote:
> On Mon, 19 Aug 2002, Jan Tichy - Webbie wrote:
> 
> > BTW nemelo by to byt jedno? Nema nahodou AND
> > obecne vetsi pripritu nez OR? IMHo je jedno zda napisete
> > "neco OR neco AND neco"   ci    "neco AND neco OR neco"
> > vzdy by se melo nejprve rozhodnout   "neco AND neco"
> > a pak teprve ten vysledek OR neco. Ale asi to zalezi
> > na implementaci konkretniho databazoveho stroje.. (???)
> 
> Rika se tomu zkracene vyhodnocovani, coz znamena, ze je-li nejlevejsi cast 
> pravdiva a nasleduje operator OR, tak se zbyvajici casti vubec nezabyva a 
> vyhodnuceje podminku jako pravdivou. 
> Obdobne je tomu u operatoru AND, je-li nejlevejsi cast nepravdiva, 
> zbyvajici casti se vubec nezabyva a vyhodnocuje podminku jako nepravdivou. 
> Takze ty zavorky tam opravdu chybely ;-)

Se zkráceným vyhodnocováním to nemá nic společného. Jde jen a jen
o prioritu operátorů. Zkrácené vyhodnocování vám jen ušetří zbytečné
testy, ale nemůže změnit hodnotu výrazu (tedy pokud vyhodnocení podmínek
nemá vedlejší účinky, ale to tady nehrozí).

Aby to bylo úplně jasné, zkusme si to na příkladu:


SQL> select * from t1;

          ID           A1           A2           A3
============ ============ ============ ============

           0            0            0            0
           1            0            0            1
           2            0            1            0
           3            0            1            1
           4            1            0            0
           5            1            0            1
           6            1            1            0
           7            1            1            1

SQL> select * from t1 where a1>0 or a2>0 and a3>0;

          ID           A1           A2           A3
============ ============ ============ ============

           3            0            1            1
           4            1            0            0
           5            1            0            1
           6            1            1            0
           7            1            1            1

SQL> select * from t1 where a1>0 or (a2>0 and a3>0);

          ID           A1           A2           A3
============ ============ ============ ============

           3            0            1            1
           4            1            0            0
           5            1            0            1
           6            1            1            0
           7            1            1            1

SQL> select * from t1 where a3>0 and a2>0 or a1>0;

          ID           A1           A2           A3
============ ============ ============ ============

           3            0            1            1
           4            1            0            0
           5            1            0            1
           6            1            1            0
           7            1            1            1

SQL> select * from t1 where (a1>0 or a2>0) and a3>0;

          ID           A1           A2           A3
============ ============ ============ ============

           3            0            1            1
           5            1            0            1
           7            1            1            1


Jediný výsledek, který se liší, je poslední, kde se přednostně
vyhodnocuje OR a pak teprve AND. Ve třetím příkladu jsou
závorky zbytečné, proto dopadne stejně jako první.

                                                Michal Kubeček


Další informace o konferenci Test