Ne, zacházení Oracle s nulami je svérázné, odlišné od všech ostatních a není v souladu se standardy ANSI. Na obranu společnosti Oracle se však pravděpodobně usadil a zavázal se k tomuto zacházení dlouho předtím, než existoval standard ANSI, který by měl být v souladu!
Vše začíná tím, že Oracle ukládá řetězce s počtem znaků následovaným daty řetězce. NULL je reprezentován počtem znaků nula bez následujících dat řetězce - což je přesně totéž jako prázdný řetězec (''). Oracle prostě nemá způsob, jak je rozlišit.
To vede k nějakému zvláštnímu chování, jako je tento případ zřetězení. Oracle má také funkci LENGTH, která vrací délku řetězce, ale ta byla definována opačným způsobem, takže LENGTH('') vrací NULL, nikoli nulu. Takže:
LENGTH('abc') + LENGTH('') IS NULL
LENGTH('abc' || '') = 3
což se mi zdá porušovat základní matematické principy.
Vývojáři Oracle si na to samozřejmě tak zvykli, že mnozí z nás na tom ani nevidí nic špatného nebo zvláštního – někteří budou ve skutečnosti namítat, že zbytek světa se mýlí a že prázdný řetězec a NULL jsou to samé!