Oracle SQL-də FALSE və UNKNOWN(NULL) şərtlərin izahı
SQL istifadəçilərinin tez-tez qarışıq saldıqları Where hissində yazılan şərtin
FALSE yoxsa UNKNOWN nəticə
qaytarması məsləsinə aydınlıq vermək istəyirəm.
Ümumiyyətlə,
Where hissəsində yazılan şərtin həm FALSE , həm də UNKNOWN olduğunda sətir sayı
0 olaraq qayıdır. Ancaq bir incə məqam var.
İlk
olaraq, qeyd edək ki, şərt
o
vaxt True olur ki, həmin şərt doğru olsun,
o
vaxt False olur ki, həmin şərt doğru olmasın,
o
vaxt Unknown olur ki, müqayisə olunan tərəflərdən ən azı biri NULL qiymətdir. IS NULL müqayisəsi istisnadır.
Aşağıda
göstərəcəyim misalda, 1-ci select sətrində şərt False, 2-ci select şərtində şərt
Unknown qiyməti olacaq.
select 'yes' AS "Result" from dual
where 1=2;
Bu 1=2 şərti
FALSE qiyməti aldığı üçün qayıdan sətir sayı 0 olacaq.
select 'yes' AS "Result" from dual
where 1=null;
Bu 1=NULL şərti
UNKNOWN qiyməti
aldığı üçün qayıdan sətir sayı 0 olacaq.
Eyni şərtlərə NOT operatoru tətbiq etsən aşağıdakı nəticələri
alarıq:
select 'yes' AS "Result" from dual
where NOT(1=2);
NOT operatoru FALSE qiyməti TRUE qiymətə çevirdiyindən, 1 sətr
qayıdır.
select 'yes' AS "Result" from dual
where NOT(1=null);
NOT operatoru UNKNOWN qiymətini ele UNKNOWN qiyməti kimi
saxladığından qayıdan sətir sayı yenə də 0 olacaq.
Buradan məlum olur ki, əgər 1=NULL şərti FALSE qiyməti
olsaydı, o zaman NOT (1=NULL) TRUE olardı və sətir sayı 1 olardı.
Ancaq,
gördüyümüz kimi, nətir sayı 0 qaldı. Deməli 1=NULL şərti UNKNOWN qiyməti alır
ki, NOT operatoru onu TRUE qiymətə çevirmədi.
UNKNOWN
şərtin təsir etdiyi məqamlardan aşağıdakını misal göstərə bilərik.
Tutaq
ki, Employees adlı cədvələ Department_ID sütunu var. Cədvəldə 46 sətrin Department_ID sütununda 40 və ya 50 qiyməti
yazılıb. Cəmi 107 sətr var. Sətirlərdən 1-ində Department_ID NULL-dır (boşdur).
Beləliklə:
Select
count(*) from Employees
Where Department_ID in (40, 50);
Nəticə:
46
Select
count(*) from Employees
Where Department_ID not in (40, 50);
Nəticə:
60
Əslində,
şərtlər biri o birinin əksi olduğu üçün, ilk baxışdan çaşdırıcı görsənir və
praktikada çətinlik yara bilir. 60 + 46 = 106 (amma cədvəldə cəmi 107 sətr var)
Odur
ki, əgər şərtdə yazdığımız sütunda NULL halı varsa, mütləq NULL olan sətirlərə
fərdi yanaşma etməliyik.
Məsələn:
Select
count(*) from Employees
Where Department_ID not in (40, 50) or Department_ID IS NULL;
Nəticə:
61
61 +
46 = 107
Ümid edirəm, müəyyən qədər aydınlıq gətirə bildim.
No comments:
Post a Comment