Discussion:
[Oracle] Co to jest NULL
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
Dawid Sza³êga
2003-12-01 08:25:23 UTC
Permalink
Witam,
Wytłumaczcie mi dlaczego dla Oracla NULL i wartość '' (string o długości 0)
to to samo skoro to są dwa różne typy danych.
--
Pozdrawiam,
Dawid Szałęga
Marcin Goralski
2003-12-01 08:55:56 UTC
Permalink
Post by Dawid Sza³êga
Witam,
Wytłumaczcie mi dlaczego dla Oracla NULL i wartość '' (string o długości 0)
to to samo skoro to są dwa różne typy danych.
to nie sa _typy_ danych, tylko wartosci. Jaki jest praktyczny sens '' ?
Wiem,wiem, MS rozroznia NULL i '', ale ... po co ? Zeby moc obejsc klazule
NOT NULL ?

marcin
Dawid Sza³êga
2003-12-01 09:21:53 UTC
Permalink
Post by Marcin Goralski
to nie sa _typy_ danych, tylko wartosci.
To są zarówno różne typy danych jak i wartości '' (typ string), 0 (typ
integer), false (typ boolowski), null (typ nieokreślony) - są to różne dane
o róznych typach choć teoretycznie mają podobne znaczenia.

Jaki jest praktyczny sens '' ?
Post by Marcin Goralski
Wiem,wiem, MS rozroznia NULL i ''
Nie tylko MS. MySQL i PostgreSQL też rozróżnia te dane.

, ale ... po co ? Zeby moc obejsc klazule
Post by Marcin Goralski
NOT NULL ?
Jest wiele różnych zastosować '' i NULL dlatego zdziwoło mnie to że tak
potężna baza jak Oracle całkowicie olewa te różnice... Czy ktoś zna może
jakieś racjonalne podejście i wytłumaczenie Oracla dlaczego tak jest.?
--
Pozdrawiam,
Dawid Szałęga
Marcin Goralski
2003-12-01 10:33:24 UTC
Permalink
Post by Dawid Sza³êga
Jest wiele różnych zastosować '' i NULL dlatego zdziwoło mnie to że tak
rzuc jakims praktycznym ok ? tylko na poziomie bazy a nie aplikacji.

marcin
hubert depesz lubaczewski
2003-12-01 09:45:46 UTC
Permalink
Post by Marcin Goralski
to nie sa _typy_ danych, tylko wartosci. Jaki jest praktyczny sens '' ?
Wiem,wiem, MS rozroznia NULL i '', ale ... po co ? Zeby moc obejsc klazule
NOT NULL ?
'' to pusty ciag znakow. null to wartosc nieokreslona. czy widzisz
roznice?
zreszta samo oracle w manualach twierdzi, ze ta "funkcjonalnosc" moze
zostac zmieniona.

depesz
--
_______________________________________________________________
najwspanialszą rzeczą jaką dało nam nowoczesne społeczeństwo,
jest niesamowita wręcz łatwość unikania kontaktów z nim ...
Michal
2003-12-01 09:55:47 UTC
Permalink
Niestety obecnie w Oracle 8i string '' oraz NULL to jest to samo. Wystarczy
wstawic string '' do tabeli a potem dac select z tabeli gdzie wartosc jest
NULL. Select wybierze nam rowniez string ''
Wiec na dzis dzien jest to to samo.

Michal D.
Post by hubert depesz lubaczewski
Post by Marcin Goralski
to nie sa _typy_ danych, tylko wartosci. Jaki jest praktyczny sens '' ?
Wiem,wiem, MS rozroznia NULL i '', ale ... po co ? Zeby moc obejsc klazule
NOT NULL ?
'' to pusty ciag znakow. null to wartosc nieokreslona. czy widzisz
roznice?
zreszta samo oracle w manualach twierdzi, ze ta "funkcjonalnosc" moze
zostac zmieniona.
depesz
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
Marcin Goralski
2003-12-01 10:07:16 UTC
Permalink
Post by Michal
Niestety obecnie w Oracle 8i string '' oraz NULL to jest to samo. Wystarczy
wstawic string '' do tabeli a potem dac select z tabeli gdzie wartosc jest
NULL. Select wybierze nam rowniez string ''
Wiec na dzis dzien jest to to samo.
To samo jest w 9i.

marcin
Marcin Goralski
2003-12-01 10:19:27 UTC
Permalink
Post by hubert depesz lubaczewski
'' to pusty ciag znakow. null to wartosc nieokreslona. czy widzisz
roznice?
oczywiscie ze widze roznice. Nadal pytam o praktyczny sens takiego
rozwiazania.
przyklad (z 9i)
tablica czlowiek
(id number not null,
nazwisko varchar2(50) not null, imie varchar2(30) not null,
imie2 varchar2(30)
)


insert into czlowiek values (1,'Kowalski','Piotr','');
insert into czlowiek values (2,'Jankowski','Dariusz',null);
insert into czlowiek (id, nazwisko, imie) values (3,'Iksinski','Jan');


select * from czlowiek where imie2 = ''
SQL> /

no rows selected


SQL> select nazwisko from czlowiek where imie2 is null;

NAZWISKO
--------------------------------------------------
Kowalski
Jankowski
Iksinski


pewnie przyklad nie za dobry - ale z praktycznego punktu widzenia - jaki
jest sens wpisywac '' w imie2 jesli czlowiek nie ma drugiego imienia ?!?!

Oracle twierdzi duzo rzeczy, a poki co jest jak jest, co potwierdza powyzszy
przyklad.
Nadal czekam na wyjasnienie, jaki jest sens uzycia pustego stringu. Zeby
uzywac funcji isEmpty() z VB :-> ?

marcin
Michal
2003-12-01 10:29:18 UTC
Permalink
Twoj select nie zwraca zadnej wartosci poniewaz do NULLa nie mozna uzywac
operatora porownania tylko IS NULL. W momencie instert'a string '' jest
zamieniany na NULL wiec porowanie typu ='' jest juz nieaktualne.

Michal D.
Post by Marcin Goralski
Post by hubert depesz lubaczewski
'' to pusty ciag znakow. null to wartosc nieokreslona. czy widzisz
roznice?
oczywiscie ze widze roznice. Nadal pytam o praktyczny sens takiego
rozwiazania.
przyklad (z 9i)
tablica czlowiek
(id number not null,
nazwisko varchar2(50) not null, imie varchar2(30) not null,
imie2 varchar2(30)
)
insert into czlowiek values (1,'Kowalski','Piotr','');
insert into czlowiek values (2,'Jankowski','Dariusz',null);
insert into czlowiek (id, nazwisko, imie) values (3,'Iksinski','Jan');
select * from czlowiek where imie2 = ''
SQL> /
no rows selected
SQL> select nazwisko from czlowiek where imie2 is null;
NAZWISKO
--------------------------------------------------
Kowalski
Jankowski
Iksinski
pewnie przyklad nie za dobry - ale z praktycznego punktu widzenia - jaki
jest sens wpisywac '' w imie2 jesli czlowiek nie ma drugiego imienia ?!?!
Oracle twierdzi duzo rzeczy, a poki co jest jak jest, co potwierdza powyzszy
przyklad.
Nadal czekam na wyjasnienie, jaki jest sens uzycia pustego stringu. Zeby
uzywac funcji isEmpty() z VB :-> ?
marcin
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
Marcin Goralski
2003-12-01 10:37:31 UTC
Permalink
Post by Michal
Twoj select nie zwraca zadnej wartosci poniewaz do NULLa nie mozna uzywac
operatora porownania tylko IS NULL. W momencie instert'a string '' jest
zamieniany na NULL wiec porowanie typu ='' jest juz nieaktualne.
Dzieki, nie wpadlbym na to. A co chcialem pokazac, jak myslisz ?

marcin
Michal
2003-12-01 10:47:20 UTC
Permalink
Chodzilo mi o to ze nie ma znaczenia czy uzyjesz pustego stringu czy NULLa,
bo rezultat jest taki sam. Sens uzycia pustego stringu moze byc wtedy gdy np.
tworzysz dynamiczne inserty albo robisz insert z formularzy, przeciez lepiej
jest gdy Oracle zamieni stringi '' na NULL niz gdybys musial robic to sam
sprawdzajac kazde pole czy jest puste.

Michal
Post by Marcin Goralski
Post by Michal
Twoj select nie zwraca zadnej wartosci poniewaz do NULLa nie mozna uzywac
operatora porownania tylko IS NULL. W momencie instert'a string '' jest
zamieniany na NULL wiec porowanie typu ='' jest juz nieaktualne.
Dzieki, nie wpadlbym na to. A co chcialem pokazac, jak myslisz ?
marcin
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
hubert depesz lubaczewski
2003-12-01 10:58:33 UTC
Permalink
Post by Marcin Goralski
oczywiscie ze widze roznice. Nadal pytam o praktyczny sens takiego
rozwiazania.
bo tak jestr wygodniej - czasem.
przyklad.
tabela cacheujaca revdns'y (potrzebna do pewnego projektu).
struktura: ip, revdns
revdns typu tekstowego.
jak byl null to znaczy, ze nie byl jeszcze sprawdzany i trzeba go
sprawdzic. a jak pusty to znaczy, ze przeszedl juz sprawdzanie tylko sie
nie resulwuje.
fakt, ze ty tego nie uzywasz to jedna sprawa. a fakt, ze samo oracle
twierdzi, ze to co zrobili moga zmienic, wiec by sie nie przyzwyczajac
do takiego dzialania - to zupelnie inna sprawa.

jak do tej pory nie slyszalem o innej niz oracle bazie ktora by
implementowala null == ''.

jest to tak dziwne podejscie, ze szok. przykladem innym - skoro chciales
na ludziach.
nazwisko panienskie.
facet nie ma pustego tylko null'a - bo w jego sytuacji ta informacja
"nie dotyczy".

depesz
--
_______________________________________________________________
najwspanialszą rzeczą jaką dało nam nowoczesne społeczeństwo,
jest niesamowita wręcz łatwość unikania kontaktów z nim ...
Rafał Jank
2003-12-01 11:10:12 UTC
Permalink
Post by hubert depesz lubaczewski
jest to tak dziwne podejscie, ze szok. przykladem innym - skoro chciales
na ludziach.
nazwisko panienskie.
facet nie ma pustego tylko null'a - bo w jego sytuacji ta informacja
"nie dotyczy".
Niesłusznie, przynajmniej według polskiego prawa. No, ale to już OT.
--
"Gall prawdę pisał
Jak nikt więcej po nim
Jemu było łatwiej
Bo on był Anonim"
Marcin Goralski
2003-12-01 12:18:12 UTC
Permalink
Post by hubert depesz lubaczewski
bo tak jestr wygodniej - czasem.
przyklad.
tabela cacheujaca revdns'y (potrzebna do pewnego projektu).
struktura: ip, revdns
revdns typu tekstowego.
jak byl null to znaczy, ze nie byl jeszcze sprawdzany i trzeba go
sprawdzic. a jak pusty to znaczy, ze przeszedl juz sprawdzanie tylko sie
nie resulwuje.
hmmm, moze dla Ciebie to wygodniej. Ja bym wolal uzyc jawnie flagi, typu
boolean czy int (i limitowana ilosc wartosci) jako oddzielnego pola, niz tak
kombinowac.
Post by hubert depesz lubaczewski
fakt, ze ty tego nie uzywasz to jedna sprawa. a fakt, ze samo oracle
twierdzi, ze to co zrobili moga zmienic, wiec by sie nie przyzwyczajac
do takiego dzialania - to zupelnie inna sprawa.
to nie tak. Kiedy uzywalem Postgresa, uzywalem NULLi, anie ''. Kiedy
uzywalem INGRESa, tak samo (nawet nie wiem, czy '' tak istnial). Z MSSQLem
robie dokladnie tak samo.
Post by hubert depesz lubaczewski
jak do tej pory nie slyszalem o innej niz oracle bazie ktora by
implementowala null == ''.
czyli co ? wiekszosc ma zawsze racje ?
Post by hubert depesz lubaczewski
facet nie ma pustego tylko null'a - bo w jego sytuacji ta informacja
"nie dotyczy".
Nie wiem, co na to prawo (patrz post Rafala), ale to akurat (dla mnie) bez
sensu. Masz zawsze wyroznienie plci, lub mozesz ja wyroznic po PESELU jesli
go masz, wiec sprawdzanie czy nazwisko panienskie jest NULL czy puste jest
dla mnie zbytnim kombinowaniem.

marcin
hubert depesz lubaczewski
2003-12-01 12:42:45 UTC
Permalink
Post by Marcin Goralski
Nie wiem, co na to prawo (patrz post Rafala), ale to akurat (dla mnie) bez
sensu. Masz zawsze wyroznienie plci, lub mozesz ja wyroznic po PESELU jesli
go masz, wiec sprawdzanie czy nazwisko panienskie jest NULL czy puste jest
dla mnie zbytnim kombinowaniem.
nie chodzi mi o sprawdzanie, a o wewnetrzna logike danych w bazie.

depesz
--
_______________________________________________________________
najwspanialszą rzeczą jaką dało nam nowoczesne społeczeństwo,
jest niesamowita wręcz łatwość unikania kontaktów z nim ...
Jozef Zbrodel
2003-12-03 07:46:27 UTC
Permalink
Pewnego pięknego dnia: pon 1. grudnia 2003 13:18, Marcin Goralski napisał
Post by Marcin Goralski
hmmm, moze dla Ciebie to wygodniej. Ja bym wolal uzyc jawnie flagi, typu
boolean czy int (i limitowana ilosc wartosci) jako oddzielnego pola, niz
tak kombinowac.
Wiem że to jest trochę "co kto lubi", ale ja tu się "ideologicznie" zgadzam
z Depeszem. Null to jest wartość "cholera wie jaka" i jest to ideologicznie
co innego niż pusty string. Bo pusty string, to taki zupełnie normalny
string, o którym wszystko wiemy, w szczególności to że z jakiś powodów ma
długość 0.

Poza tym: skoro zaczniemy traktować puste stringi jak nulle, to za chwile
ktoś stwierdzi że jemu pasuje trakować jako nulle wartości zerowe w polach
numerychnych. I też na upartego dało by się wyskrobać jakieś
uzasadnienie... ;-]]

Jak dla mnie, to sytuacja w której puste stringi chcialoby się traktować jak
nulle, wskazuje na błąd w projekcie (oczywiście, zawsze da się pokazać
jakiś egzotyczny przykład w którym to byłoby akurat uzasadnione, ale mówię
ogólnie). Albo na niechlujstwo przy pisaniu aplikacji: miałem do czynienia
z aplikacją, w której, jeśli pole na formatce nie zostało wypełnione, to w
zależności od tego jaką drogą użytkownik przeszedł przez fomatkę, w
kolumnie lądowały albo puste stringi albo nulle ;-]]


Pzdr
J.

RM
2003-12-01 11:27:28 UTC
Permalink
Post by Marcin Goralski
Wiem,wiem, MS rozroznia NULL i '', ale ... po co ?
choćby dlatego, bo :
'aaa' +'' = 'aaa'
natomiast:
'aaa' + NULL = NULL
(przy włączonym concat_null_yields_null)

np:
ulica='matejki'
miasto=NULL
adres bez miasta jest ci po nic, bo w całej polsce masz tysiące ulic
matejki.
dlatego: adres=ulica+miasto=NULL jest dużą wygodą.

RM
Marcin Goralski
2003-12-01 12:16:29 UTC
Permalink
Post by RM
ulica='matejki'
miasto=NULL
adres bez miasta jest ci po nic, bo w całej polsce masz tysiące ulic
matejki.
dlatego: adres=ulica+miasto=NULL jest dużą wygodą.
od czego constrainty ?
miasto varchar(n) NOT NULL ..., zalatwia dodatkowo problem wprowadzania
danych.

marcin
RM
2003-12-01 13:20:52 UTC
Permalink
Post by Marcin Goralski
Post by RM
ulica='matejki'
miasto=NULL
adres bez miasta jest ci po nic, bo w całej polsce masz tysiące ulic
matejki.
dlatego: adres=ulica+miasto=NULL jest dużą wygodą.
od czego constrainty ?
miasto varchar(n) NOT NULL ..., zalatwia dodatkowo problem wprowadzania
danych.
Nie chodzi o to zeby zabronic pozostawienia pustego miasta (w chwili
wpisywania rekordu moge znac ulice ale nie znac miasta), ale aby np. podczas
jakiejs korespondencji seryjnej nie bral pod uwage niekompletnych adresow.

RM
Jacuo
2003-12-01 23:34:14 UTC
Permalink
Post by RM
Post by Marcin Goralski
Wiem,wiem, MS rozroznia NULL i '', ale ... po co ?
'aaa' +'' = 'aaa'
'aaa' + NULL = NULL
(przy włączonym concat_null_yields_null)
ulica='matejki'
miasto=NULL
adres bez miasta jest ci po nic, bo w całej polsce masz tysiące ulic
matejki.
dlatego: adres=ulica+miasto=NULL jest dużą wygodą.
Akurat to doskonaly przyklad na przewage rozwiazania Oracle :

select ulica, miasto from adres where miasto is not null

Bo niby do czego potrzebny nam jest adres gdzie miasto podano, ale jako
pusty ciag ?

I ten przyklad dowodzi jednego - w praktycznych zastosowaniach ciezko
znalesc dowody na wyszosc rozdzielenia null i ciagu psutego.
Oczywiscie teoretycznie to jest bardzo zle podejscie.
W Oracle zastosowane historycznie z powodow wydajnosciowych, obecnie pod
wzgledem wydajnosci chyba juz nie ma takiego duzego znaczenia, ale
ciezko by bylo przerabiac istniejace aplikacje.
BTW, czy w 9i nie ma mozliwosci ustawienia w parametrach bazy, jak chcemy
traktowac ciag pusty ?
--
Jacek
Marcin Goralski
2003-12-02 07:30:04 UTC
Permalink
Post by Jacuo
BTW, czy w 9i nie ma mozliwosci ustawienia w parametrach bazy, jak chcemy
traktowac ciag pusty ?
W paramterach nie widzialem, choc nie zwracalem na to szczegolnej uwagi
musze przyznac. W kazdym razie jako default jest NULL = ''

marcin
RM
2003-12-02 08:54:55 UTC
Permalink
Post by Jacuo
select ulica, miasto from adres where miasto is not null
Bo niby do czego potrzebny nam jest adres gdzie miasto podano, ale jako
pusty ciag ?
jezeli chodzi o miasto to akurat nie jest potrzebne dlatego NULL. ale juz
np. brak numeru mieszkania nie przekresla sensu calego adresu, wiec wtedy
mozna stosowac ciag pusty (zamiast nulla)
Np:
ulica='matejki 9'
nr_mieszkania=''
miasto='wroclaw'

ulica+nr_mieszkania+miasto daje not null (i dobrze, bo brak numeru
mieszkania mi NIE przeszkadza)

ulica='matejki 9'
nr_mieszkania=''
miasto= null

ulica+nr_mieszkania+miasto daje null (i dobrze, bo brak miasta mi
przeszkadza)

I to byl wlasnie przyklad kiedy rozroznienie nulla i ciagu pustego dla
wygody sie przydaje

RM
Marcin Goralski
2003-12-02 09:37:23 UTC
Permalink
Post by RM
ulica='matejki 9'
nr_mieszkania=''
miasto='wroclaw'
ulica+nr_mieszkania+miasto daje not null (i dobrze, bo brak numeru
mieszkania mi NIE przeszkadza)
ulica='matejki 9'
nr_mieszkania=''
miasto= null
ulica+nr_mieszkania+miasto daje null (i dobrze, bo brak miasta mi
przeszkadza)
W Oracle concatenacja stringow nie jest rownoznaczna z dodawaniem.

W zwiazku z tym
select ulica || ' ' || nr_mieszkania || ' ' || miasto form adresy
zwroci Ci poprawna wartosc jesli nr_mieszkania bedzie null.
Zas _wymagane_ pola zalatwia sie constraintami i juz (NOT NULL)

Przyklad :

SQL> create table adr
2 (id_adr number not null,
3 ulica varchar2(50) not null,
4 mieszkanie varchar2(5),
5 miasto varchar2(50) not null);

Table created.

SQL> insert into adr values
2 (1,'matejki','2c/3','Warszawa');

1 row created.

SQL> insert into adr values
2 (2,'matejki',null,'Gdansk');

1 row created.

SQL> commit;

Commit complete.

SQL> select ulica || ' ' || mieszkanie || ' , ' || miasto from adr
2 where ulica is not null and miasto is not null;

ULICA||''||MIESZKANIE||','||MIASTO
------------------------------------------------------------------------

matejki 2c/3 , Warszawa
matejki , Gdansk

marcin
Marcin Goralski
2003-12-02 09:46:22 UTC
Permalink
Post by Marcin Goralski
SQL> select ulica || ' ' || mieszkanie || ' , ' || miasto from adr
2 where ulica is not null and miasto is not null;
dodam tylko, ze druga linia jest niepotrzebna, jako ze istnieje warunek NOT
NULL na wspomniane pola. Pospieszylem sie.

marcin
RM
2003-12-02 10:26:13 UTC
Permalink
Post by Marcin Goralski
W Oracle concatenacja stringow nie jest rownoznaczna z dodawaniem.
Przez znak + rozumiem concatenację a nie dodawanie (MSSQL też tak rozumie),
więc wszystko jest w porządku (kwestia symbolu).
Post by Marcin Goralski
W zwiazku z tym
select ulica || ' ' || nr_mieszkania || ' ' || miasto form adresy
zwroci Ci poprawna wartosc jesli nr_mieszkania bedzie null.
Zas _wymagane_ pola zalatwia sie constraintami i juz (NOT NULL)
Nie rozumiesz - mogę nie chcieć dawać ograniczenia na pole not null. W bazie
CHCĘ przechowywać niekompletne adresy (aby kiedyś można było łatwiej go
uzupełnić).
Ja mówiłem o sytuacji aby wyrażenie ulica+nr_mieszkania+miasto zwracało mi
nula gdy nie ma miasta, ale zeby nie zwracło mi nula gdy nie ma
nr_mieszkania.
Czyli baza jest niekompletna - zawiera adresy bez miasta (bo adresy bez
miasta będa mi potrzebne do czegoś innego np. do uzupełnienia danych w
późniejszym terminie) ale przy okazji np. wysyłki kartek świątecznych
zapytanie:
SELECT ulica+nr_mieszkania+miasto FROM adresy
ma mi zwrócić poprawny adres na kopercie (czyli bez żadnych dodatkowych
warunków ma wyrzucić adresy bez miasta).
Post by Marcin Goralski
SQL> select ulica || ' ' || mieszkanie || ' , ' || miasto from adr
2 where ulica is not null and miasto is not null;
ULICA||''||MIESZKANIE||','||MIASTO
------------------------------------------------------------------------
matejki 2c/3 , Warszawa
matejki , Gdansk
nie wiem jak w oraclu, ale domyślnie (wg ANSI) concatenacja z nullem daje
nulla, więc twoje zapytanie zwróci tylko jeden rekord:
matejki 2c/3, Warszawa

A z kolei jeżeli zmienię domyślne ustawienie CONCAT_NULL_YIELDS_NULL na OFF,
wtedy będę musiał jednak dodać ten warunek (WHERE miasto is not null) do
zapytania.
A dzięki rozróżnieniu NULLa i pustego stringa można tego uniknąć. Wiem, że
nie jest to wielkie usprawnienie, ale prosiłeś o przykłady.

RM
Marcin Goralski
2003-12-02 12:32:03 UTC
Permalink
Post by RM
Nie rozumiesz - mogę nie chcieć dawać ograniczenia na pole not null. W bazie
rozumiem, ale to Twoj problem jako designera. Jesli znadzasz sie na nulle,
to dodaj klauzule not null w odpowiednich where.
Post by RM
CHCĘ przechowywać niekompletne adresy (aby kiedyś można było łatwiej go
uzupełnić).
Ja mówiłem o sytuacji aby wyrażenie ulica+nr_mieszkania+miasto zwracało mi
nula gdy nie ma miasta, ale zeby nie zwracło mi nula gdy nie ma
nr_mieszkania.
Jak wyzej - odpowiedni select ... where ... not null
Post by RM
nie wiem jak w oraclu, ale domyślnie (wg ANSI) concatenacja z nullem daje
matejki 2c/3, Warszawa
moje zapytanie zwrocilo dwa rekordy - przyklad nie byl robiony z pamieci,
tylko z rzeczywistego system (9i), wiec nie mow mi co _zwroci_. Popatrz
jeszcze raz na statement - tam jest konkatenacja z nullem.

I na to tez spojrz :
SQL> select 'aaaa' || NULL from dual;

'AAA
----
aaaa
Post by RM
A z kolei jeżeli zmienię domyślne ustawienie CONCAT_NULL_YIELDS_NULL na OFF,
wtedy będę musiał jednak dodać ten warunek (WHERE miasto is not null) do
zapytania.
no i ? Z drugiej strony, jaki jest w ogole sens przechowywania adresow bez
miast ? Tak sobie, dla zabawy teoretycznej ? Rozumiem jeszcze opuszczenie
numeru domu, czy mieszkania, ale miasta ?!?!?!
Post by RM
A dzięki rozróżnieniu NULLa i pustego stringa można tego uniknąć. Wiem, że
nie jest to wielkie usprawnienie, ale prosiłeś o przykłady.
Oki, dla mnie EOT

marcin
muzzy
2003-12-02 12:19:49 UTC
Permalink
Post by RM
ulica+nr_mieszkania+miasto daje not null (i dobrze, bo brak numeru
mieszkania mi NIE przeszkadza)
ulica='matejki 9'
nr_mieszkania=''
miasto= null
ulica+nr_mieszkania+miasto daje null (i dobrze, bo brak miasta mi
przeszkadza)
I to byl wlasnie przyklad kiedy rozroznienie nulla i ciagu pustego dla
wygody sie przydaje
Wyższość swiąt Bożego Narodzenia nad swiętami Wielkiej Nocy.....
Zrównanie lub rozróżnienie NULL i pustego ciągu można tak łatwo obejść w
każdym zastosowaniu że chyba nie ma sensu wymyslanie dalszych
przykładów.....
Pzdr
Marcin B
Jacuo
2003-12-02 22:52:02 UTC
Permalink
Post by RM
Post by Jacuo
select ulica, miasto from adres where miasto is not null
Bo niby do czego potrzebny nam jest adres gdzie miasto podano, ale jako
pusty ciag ?
jezeli chodzi o miasto to akurat nie jest potrzebne dlatego NULL. ale juz
np. brak numeru mieszkania nie przekresla sensu calego adresu, wiec wtedy
mozna stosowac ciag pusty (zamiast nulla)
ulica='matejki 9'
nr_mieszkania=''
miasto='wroclaw'
ulica+nr_mieszkania+miasto daje not null (i dobrze, bo brak numeru
mieszkania mi NIE przeszkadza)
ulica='matejki 9'
nr_mieszkania=''
miasto= null
ulica+nr_mieszkania+miasto daje null (i dobrze, bo brak miasta mi
przeszkadza)
I to byl wlasnie przyklad kiedy rozroznienie nulla i ciagu pustego dla
wygody sie przydaje
ulica='matejki 9'
nr_mieszkania=null
miasto='wroclaw'

ulica+nr_mieszkania+miasto daje null a chyba nie o to chodzi ?
--
Jacek
RM
2003-12-03 07:21:56 UTC
Permalink
Post by RM
Post by RM
ulica='matejki 9'
nr_mieszkania=''
miasto='wroclaw'
ulica+nr_mieszkania+miasto daje not null (i dobrze, bo brak numeru
mieszkania mi NIE przeszkadza)
ulica='matejki 9'
nr_mieszkania=null
miasto='wroclaw'
ulica+nr_mieszkania+miasto daje null a chyba nie o to chodzi ?
Zgadza się. Dlatego ja nie napisałem, że nr_mieszkania=null, ale, że
nr_mieszkania='' (pusty string).

To dowodzi tego, że zachowanie się nulla i pustego stringa jest czasami
różne (co można wykorzystać dla wygody).
Więc traktowanie przez Oracle nulla jako '' jest pewnym ograniczeniem. Nie
jest to wielkie ograniczenie (zawsze można je obejść stosując inne
wyrażenia), ale jednak jest.

RM
Krzysztof Krzyżaniak
2003-12-02 19:31:37 UTC
Permalink
Post by Dawid Sza³êga
Witam,
Wytłumaczcie mi dlaczego dla Oracla NULL i wartość '' (string o długości 0)
to to samo skoro to są dwa różne typy danych.
Zaszłość historyczna i wymuszna kompatybilność z poprzednimi wersjami
(czyli tzw. życie).

eloy
--
-------e-l-o-y-----------e-l-o-y-@-t-r-a-n-s-i-l-v-a-n-i-a-.-e-u-.-o-r-g------

jeżeli nam zabraknie sił zostaną jeszcze morze i wiatr
Loading...