Warning: Declaration of Suffusion_MM_Walker::start_el(&$output, $item, $depth, $args) should be compatible with Walker_Nav_Menu::start_el(&$output, $item, $depth = 0, $args = Array, $id = 0) in /DISK2/WWW/plsql.cz/www/wp-content/themes/suffusion/library/suffusion-walkers.php on line 0
May 082011
 

Nedávno jsem postřehl na builder.cz vlákno, kde programátoři řešili jak efektivně získat nejmenší (největší) hodnotu ze 3 čísel. Podobnou úlohu jsem také řešil asi před rokem a zjistil jsem, že vzásadě není žádné úplně uspokojové řešení nebo funkce, která by v Oracle dokázala jednoduše vrátit nejmenší (největší)  hodnotu z několika čísel. Jsou však nějaké možnosti, jak toho docílit

 

1 ) Pomocí MIN a MAX z SQL a skalráního subSELECTU, prasárna

2) Pomocí vlastního CASE, takto se to typicky i dělá

3) Vlastní funkce v PL/SQL

4) Použití funkce LEAST/GREATEST.

5) Jiné možnosti…

 

Na první pohled je jednoznačný favorit funkce LEAST (GREATEST), což je funkce které poskytnete  libovolný počet parametrů  a ona vám vrátí tu nejmenší (největší) hodnotu.  Zdá  se, že stačí zavolat jen některou z těchto dvou funkcí a získáme přesně to co chceme, bohužel – funkce LEAST a GREATEST zachází z matematického hlediska správně s hodnotou NULL ale asi ne tak, jak by se nám to v PL/SQL programch šiklo. Inu, co s tím – v závislosti na datech si lze pomoci některou funkcí, která pracuje s NVL – NVL, NVL2. V nejhorším případě musíme u každé vstupní proměnné použít COALESCE funkci a do té ještě vložit všechny parametry a ještě ve správném pořadí,  tedy:
select greatest(coalesce(a,b,c),coalesce(b,c,a),coalesce(c,b,a)) from tbl_s_abc_cols;

Pokud nám však nevadí jak se obě funkce chovají k NULL hodnotám, pak je nejmenší (největší z n) opravdu jednoduché :

select greatest(1,3,9,0,300) from dual;

 Posted by at 11:51

 Leave a Reply

(required)

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>