A NULL rendszám... :)

Hozzászólások

érdemes lenne megpróbálkoznia a név változtatással is :P

[új] - No rainbow, no sugar - [új]

Tegye fel a kezet, aki dolgozott mar olyan rendszeren, ahol a "NULL" string eseten az oszlop NULL-kent akart beirodni a db-be - fuggetlenul attol, hogy a column NOT NULL volt-e. :)

Olyannal konkrétan nem találkoztam, ami a

'NULL'

stringet

NULL

-nak feleltette volna meg, viszont olyannal nagyon is (Oracle Database 11g (?) Express Edition), ami az üres stringet (

''

) mindenképpen

NULL

-ként írta be, függetlenül attól, hogy az oszlop

NOT NULL

volt-e, vagy sem. És mivel a cikk szerint a fickó megkapott minden bírságot, amihez nem tartozott rendszámtábla, így nem tűnik lehetetlennek a felállás, hogy a DB marhasága miatt az üres stringek (nincs rendszám)

NULL

-ként kerüljenek be, viszont a rendszer marhasága miatt lekérés után hibásan stringgé (

'NULL'

) castolódjanak. (A szutyok scriptnyelvekben ilyesmi elő szokott fordulni.)

De ez csak tipp.

ami az üres stringet ('') mindenképpen NULL-ként írta be
azert nem artana ismerni azt amivel az ember dolgozik, es akkor nem ernek meglepetesek :)

függetlenül attól, hogy az oszlop NOT NULL volt-e, vagy sem
en meg nem talalkoztam olyan Oracle verzioval (8+) ami a NOT NULL oszlopba null erteket irt volna be, csak hibat ir a not null constraint miatt.

> azert nem artana ismerni azt amivel az ember dolgozik, es akkor nem ernek meglepetesek :)

Hát ja. Főleg, ha derült égből seggbebaszásként közli a főnök, hogy megnyertük a kukakula kupakfeltöltő webes játékának a kivitelezését és van egy hetünk összedobni valamit, viszont a DB az Oracle lesz, mert az ő szerverükön kell dolgozni és ők ezt biztosítják. Hogy mi? Sose volt dolgod Oracle-lel? Oldd meg. Így elég nehéz "ismerkedni". :/

> en meg nem talalkoztam olyan Oracle verzioval (8+) ami a NOT NULL oszlopba null erteket irt volna be, csak hibat ir a not null constraint miatt.

Hát nekünk meg ezt csinálta. Lehet, hogy valami beállítási mizéria volt, amiről nekünk gőzünk nem volt, hogy be lehet állítani, de egyfelől a beállításokhoz nem is fértünk hozzá, másfelől meg mint mondtam: mélyvíz volt.

Csakhogy az a baj, hogy a null constraint csak és kizárólag oszlopokra vonatkozik, query-kre nem és az Oracle pedig azokban is behelyettesíti.

Az a query, hogy

SELECT COUNT(1) FROM "TABLA" WHERE "OSZLOP" = '';

úgy fog valójában lefutni, hogy

SELECT COUNT(1) FROM "TABLA" WHERE "OSZLOP" = NULL;

és mivel

NULL

-al nem lehet komparálni, így nulla találatot kapunk. (És egyébként ez így elég vicces, mert az igaz, hogy a

NULL

az nem érték, hanem állapot, de akkor hogy lehet egy értéket behelyettesíteni egy értékként kezelt állapottal, úgy, hogy a behelyettesített pszeudoértékkel komparálni nem lehet? Ez a felállás ugyanis logikailag azt jelenti, hogy

('' == NULL) && (NULL != '')

. Ez hogy a fárasba jött ki?)

Persze lehet mondani, hogy ha üres stringre szűrök, akkor nem ezt kell beírni, hanem azt, hogy

SELECT COUNT(1) FROM "TABLA" WHERE "OSZLOP" IS NULL;

csakhogy ki mondta, hogy konkrétan üres stringre szűrök? Én egy string változó tartalmára szűrök, ami akár üres is lehet. Ennek megfelelően plusz egy elágazás, hogy ha üres a változó, akkor az egyik lekérést futtassa és

NULL

állapotra szűrjön, ha meg nem az, akkor meg komparáljon.

És egyébként a mai napig nem kaptam épeszű választ, hogy miért van ez így Oracle-ben. Oké, történelmi okok, kompatibilitás, etc.; nagy kaland volna betenni valahova egyetlen boolean változót, hogy a kompatibilis viselkedés és épeszű viselkedés között váltani lehessen? (És ez a történelmi dolgokra való hivatkozás is csak arra ad - egy egyébként elég gyenge - magyarázatot, hogy miért van még mindig így, de arra nem, hogy anno minek kellett ezt így implementálni...)