Mozno Vas to prekvapi, ale su databazy ktore rozoznavaju NULL a prazdny string.
Skuste si obzriet svet mimo Oracle a skusit co vam vrati porovnanie dvoch prazdnych stringov.
Rownum je pseudosloupec a vice o jeho pouziti zde http://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns009.htm
autor pisal o "vymozenosti" kde "Conditions testing for ROWNUM values greater than a positive integer are always false".
Co je minimalne neesteticke, nech to okecava Oracle ako chce.
Možná to překvapí vás, ale chování null není fyzikální zákon. Chování v jednotlivých systémech se liší a je obvykle dobře dokumentované. Problémy s tím mají jen lidé, co se naučí systém jeden a pak automaticky stejné požadavky kladou na jakýkoliv další systém, se kterým se setkají. Přitom rozhodnout, který přístup je ten správný, je asi tak důležité jako rozhodnout, zda by vše mělo být little-endian nebo big-endian. Oba jsou to příklady zcela zásadních otázek v oblasti IT.
A chování ROWNUM je zcela správné. Je to virtuální sloupec, který obsahuje pořadové číslo řádku ve výsledcích. Takže když vám to vrátí řádků pět, tak to budou čísla od jedné do pěti. Bohužel řada lidí s tím má mentální problém. Nějaký zkrat v mozku, který jim brání pochopit, že první řádek má číslo jedna. Do podmínky pak napíší ROWNUM > 3 a diví se, že to nevrací nic. Nepomáhá vysvětlovat jim, že podmínka typu "nevracej první řádek" automaticky znamená, že nevrací nic. V jejich vnímání světa a matematiky může existovat seznam, který nemá první řádek a přesto nějaké řádky má. Osobně neshledávám nic estetického na seznamu, který by měl více záznamů, ale žádný by nebyl první. Pokud ani v této chvíli nerozumíte tomu, proč je výsledek podmínky ROWNUM > 3 prázdný seznam, tak si to zkuste ručně na papíře: napište si pod sebe několik řádků. Pak je očíslujte od jedné do N, po jedné. A pak ty s čísly jedna, dva a tři vygumujte. Nyní seznam znovu očíslujte - první bude řádek jedna a tak dál. A opět smažte řádky jedna až tři. Opakujte. V každém kroku budete mít seznam, kde budou řádky od jedné dál. A vy z něj podmínkou ROWNUM > 3 budete mazat první tři řádky. Skončíte s prázdným seznamem.
PS: řešení programové je snadné, jeden select necháte vracet všechny záznamy a těm přes ROWNUM přiřadíte čísla řádků. A tohle použijete jako vstup pro další select, kde už nebude podmínka na rownum, ale na dříve přiřazené číslo řádku z prvního selectu:
select * from
(
select rownum x, t.*
from moje_tabulka t
) where x > 3