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.