7.14.2020

FALSE və UNKNOWN


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