Transact-SQL. COALESCE() funksiyası

Salam Dostlar.

Bugünkü məqalədə COALESCE funksiyası ilə tanış olacağıq.

Bəzi hallarda nəticədə alınan NULL başqa qiymətlərlə əvəz edilməsi zərurəti yaranır. Məsələn, proqram təminatı üzrə hesabat veriləndə nəticədə NULL deyil onu əvəz edən hər hansı bir qiymət qoyulur. Sorğuda NULL-u başqa qiymətlə əvəz etmək üçün 3 üsul mövcuddur:

ISNULL funksiyası ilə, COALESCE funksiyası ilə və CASE ifadəsi ilə.

NULL-un əvəz olunması üçün adətən ISNULLCOALESCE funksiaylarından istifadə olunur, buna görə də biz bu gün bu iki funksiya barədə danışacağıq. Sonuncu üçüncü CASE  ifadəsi ilə biz gələn dərslərimizdə tanış olacağıq.

ISNULL funksiyası NULL-u hər hansı bir qiymətlə əvəz etmək üçün istifadə olunur. 

COALESCE funksiyası göstərilən ifadələri ardıcıllıqla qiymətləndirir və  NULL olmayan ilk ifadənin nəticəsini qaytarır.

ISNULL funksiyası T-SQL dilinə məxsus funksiyadır.

COALESCE funksiyası SQL standartlın funksiyasıdır. Bu nə deməkdir? Əgər COALESCEISNULL funksiyaları eyni nəticə verirlərsə və siz universal bir kod yazmaq istəyirsinizsə bu zaman COALESCE funksiyasından istifadə etməlisiniz, çünki ISNUL funksiyası yalnız T-SQL dialektində istifadə olunur. Təcrübəyə əsasən sırf SQL Serverlə işləyən bazalar üçün ISNULL funksiyası məsləhətdir, universal, yəni bütün VBİS-lərdə işləyən bazalar üçün COALESCE funksiyasının istifadəsi məsləhətdir.

COALESCEISNULL funksiyaları bəzi hallarda eyni nəticə verir, lakin bunların arasında fərqlər var. İlk olaraq ISNULL funksiyasına baxaq.

Keçən dərslərinizdən bizə tanış olan Northwind bazasına bir sorğu verək. Employees cədvəlindən işçilərin adı, soyadı və yaşadığı rayonu sorğu ilə alaq:

USE Northwind;
GO 
SELECT FirstName, LastName, Region FROM dbo.Employees;
GO

rezult-1

Gördüyünüz kimi, Region sütununda bəzi işçilərin qarşısında NULL görürük. Biz hesabatı bu cür vermək istəmirik və NULL-un N/A ilə (yəni Not Available – mövcud deyil) əvəz olunmasını istəyirik. Bunun üçün sorğumuzu bu cür yazmalıyıq:

SELECT FirstName, LastName, ISNULL(Region, 'N/A') AS Region 
FROM dbo.Employees;
GO

rezult-2

Nəticəyə baxırıq, bu cür görünüş bizi qane edir, yəni burada artıq NULL əvəzinə N/A yazılıb.

Eyni nəticəni biz COALESCE funksiyası ilə də ala bilərik:

SELECT FirstName, LastName, COALESCE(Region, 'N/A') AS Region 
FROM dbo.Employees;
GO

rezult-2

Gördüyünüz kimi, nəticələr eynidir. Sadəcə olaraq burada ISNULL funksiyası Region sütunundakı NULLarı “N/A” ilə əvəz etdi. COALESCE funksiyası isə NULL olmayan ilk ifadənin nəticələrini qaytardı.

COALESCE funksiyası daha geniş imkanlara malikdir. 

COALESCE funksiyası 2 ifadədən artiq ifadə qəbul edə bilir. 

ISNULL funksiyasında isə cəmi 2 ifadə olmalıdır.

SELECT ISNULL(NULL, 1234)
SELECT COALESCE(NULL, 1234, 89)

Yuxarıdakı sorğumuzu bu cür yaza bilərik:

SELECT FirstName, LastName, COALESCE(Region, 'No region', 'N/A') AS Region 
FROM dbo.Employees;
GO

rezult-3

Gördüyünüz kimi, burada Region sütunundaki NULL-lar ilk NULL olmayan qiymətlə əvəz edildi. Burada ilk NULL olmayan qiymət ‘No region’ –dur.

Daha bir fərq:

SELECT ISNULL(NULL, NULL) 
SELECT COALESCE(NULL, NULL)

rezult-8

rezult-7

Fərqli nəticə alırıq, cünki COALESCE funksiyasında ifadələrdən biri mütləq NULL-dan fərqli bir qiymət olmalıdır.

Növbəti fərq verilənlərin tipləri ilə bağlıdır. Belə bir sorğuya baxaq:

DECLARE 
 @x AS VARCHAR(3) = NULL, 
 @y AS VARCHAR(10) = '1234567890'; 
SELECT COALESCE(@x, @y) AS [COALESCE], ISNULL(@x, @y) AS [ISNULL];

rezult-4

Fərqli nəticələr alırıq. Səbəbi isə bununla bağlıdır:

COALESCE funksiyasi ilk olaraq daha üstün olan tipi seçir. 1ci ifadənin tipi varchar(3) – dursa 2-ci ifadənin tipi varchar(10) dursa həmişə 2-cini seçəcək, çünki varchar(10)  daha üstün verilənlər tipidir. ISNULL isə həmişə birinci ifadənin tipini seçəcək, yəni bizim misalda varchar(3) tipini seçəcək və qiymət 10 rəqəmli olsa da onun cəmi üçünü qaytaracaq.

Bu sorğuya baxaq:

SELECT COALESCE ('abc', 1)

rezul-5

Nəticədə səhv mesajı alırıq, çünki Integer tipi Character tipindən üstündür, buna görə də COALESCE funksiyası Integer tipini əsas götürərək, ‘abc’ sətrini   Integer tipinə çevirmək üçün cəhd edir və bunu edə bilmədiyinə görə səhv nəticə qaytarır.

SELECT ISNULL('abc', 1)

rezult-6

Burda isə cavabda “abc” alırıq, çünki ISNUL funksiyası həmişə ilk ifadənin tipini əsas götürür və ikinci ifadənin tipinin çevrilməsi zərurəti olmur.

Beləliklə, bugünkü məqalənin də sonuna gəlib çatdıq.

Növbəti məqalələrdə görüşənədək.

Diqqətinizə görə təşəkkür edirəm

Səs: +30. Bəyənilsin Zəifdir

Müəllif: Rauf Khalafov

Şərh yazın