Bu gün biz yenə NULL ilə işləməyə bir az daha dərindən baxacağıq və çox faydalı bir funksiya ilə tanış olacağıq — COALESCE(). Bu funksiya sənin datandakı NULL dəyərlərlə rahat şəkildə baş etməyə imkan verir.
Gəlin belə bir nümunəyə baxaq: səndə işçilər haqqında bir cədvəl var, amma bəzi işçilərin maaş məlumatı yoxdur. Bəs biz bütün maaşları artırmaq istəsək nə baş verəcək? Heç nə yaxşı deyil. Çünki NULL ilə əməliyyat aparmaq olmur. Bəs biz NULL maaşları, məsələn, 0 ilə əvəz etmək istəsək? Bax burada səhnəyə COALESCE() çıxır.
COALESCE() — bu funksiya verilən arqumentlər siyahısından ilk NULL olmayan dəyəri qaytarır. Əgər siyahıdakı bütün dəyərlər NULL olsa, funksiya NULL qaytarır. Sadə dillə desək, o deyir: "Mənə ilk normal dəyəri ver, zəhmət olmasa!"
Sintaksis
COALESCE(value1, value2, ..., value_n)
value1, value2, ..., value_n — bunlar funksiyaya verdiyin arqumentlərdir. O, ilk NULL olmayan dəyəri qaytaracaq.
COALESCE() ilə işləməyə nümunələr
Gəlin bir neçə nümunəyə baxaq.
Nümunə 1: NULL-u 0 ilə əvəz edirik
Tutaq ki, bizdə salaries adlı bir cədvəl var:
| id | name | salary |
|---|---|---|
| 1 | Otto | 50000 |
| 2 | Maria | NULL |
| 3 | Alex | 60000 |
| 4 | Anna | NULL |
Biz ümumi maaş məbləğini hesablamaq istəyirik - bunu etmək asandır:
SELECT SUM(salary) AS total_salary
FROM salaries;
SUM() funksiyası NULL-ları saymır, yəni problem yoxdur.
Amma sonra biz istəyirik ki, hər işçiyə 1000 bonus verək və ümumi maaşı hesablayaq.
SELECT SUM(salary+1000) AS total_salary
FROM salaries;
Və nəticə bir az qarışır. Ən yaxşısı, elə əvvəldən NULL dəyərlərdən qurtulmaq və onları COALESCE funksiyası ilə 0-a çevirməkdir. Gəlin baxaq necə olur:
SELECT SUM(COALESCE(salary, 0)) AS total_salary
FROM salaries;
Nəticə:
| total_salary |
|---|
| 110000 |
Belə daha yaxşı və etibarlıdır.
Nümunə 2: NULL-u default dəyərlə əvəz edirik
Tutaq ki, bizdə students adlı cədvəl var, adlar və ünvanlar saxlanılır:
| id | name | address |
|---|---|---|
| 1 | Anna | Kanne |
| 2 | Peter | NULL |
| 3 | Lisa | Painful |
| 4 | Alex | NULL |
Biz ünvanlardakı NULL-u "Göstərilməyib" ilə əvəz etmək istəyirik:
SELECT name, COALESCE(address, 'Göstərilməyib') AS resolved_address
FROM students;
Sorgunun nəticəsi:
| name | resolved_address |
|---|---|
| Anna | Kanne |
| Peter | Göstərilməyib |
| Lisa | Painful |
| Alex | Göstərilməyib |
Nümunə 3: Bir neçə dəyərdən istifadə
Bəzən NULL-u bir yox, bir neçə dəyərlə əvəz etmək lazım olur. Məsələn, biz istəyirik ki, ad, dostlar üçün ad və ya heç biri yoxdursa "Adsız" istifadə edək. users cədvəli:
| user_id | first_name | short_name | full_name |
|---|---|---|---|
| 1 | John | Jonny | Johnny Walker |
| 2 | NULL |
Pete | Peter Kamen |
| 3 | NULL |
NULL |
Sorgu:
SELECT user_id,
COALESCE(first_name, short_name, 'Adsız') AS display_name
FROM users;
Nəticə:
| user_id | display_name |
|---|---|
| 1 | John |
| 2 | Pete |
| 3 | Adsız |
COALESCE()-in praktik istifadəsi
Realda COALESCE() — natamam datalarla işləmək üçün əsl xilasedicidir.
Gəlin baxaq, o müxtəlif tapşırıqlarda necə kömək edir.
Nümunə 1: Mətn sahələrində dəyərlərin əvəzlənməsi
Əsas cədvəl customers:
| id | name | address |
|---|---|---|
| 1 | Alex Lin | 123 Maple St |
| 2 | Maria Chi | NULL |
| 3 | Anna Song | 456 Oak Ave |
| 4 | Otto Art | NULL |
| 5 | Liam Park | 789 Pine Rd |
Sorgu:
SELECT name, COALESCE(address, 'Göstərilməyib') AS address
FROM customers;
Nəticə:
| name | address |
|---|---|
| Alex Lin | 123 Maple St |
| Maria Chi | Göstərilməyib |
| Anna Song | 456 Oak Ave |
| Otto Art | Göstərilməyib |
| Liam Park | 789 Pine Rd |
Nümunə 2: Hesabatlar üçün datanın hazırlanması
Əsas cədvəl sales:
| id | product | price |
|---|---|---|
| 1 | Widget A | 100 |
| 2 | Widget B | NULL |
| 3 | Widget C | 250 |
| 4 | Widget D | NULL |
| 5 | Widget E | 300 |
Sorgu:
SELECT SUM(COALESCE(price, 0)) AS total_sales
FROM sales;
Nəticə:
| total_sales |
|---|
| 650 |
COALESCE() istifadə edərkən tipik səhvlər
Baxmayaraq ki, COALESCE() sadə və universal funksiya kimi görünür, onunla işləyərkən bəzi tələlər ola bilər.
Data tiplərinin uyğun olmaması. COALESCE()-ə verdiyin bütün arqumentlər data tipi baxımından uyğun olmalıdır. Məsələn, string və rəqəm dəyərləri qarışdırmaq olmaz.
-- Səhv
SELECT COALESCE(salary, 'Göstərilməyib') FROM employees;
-- salary — rəqəm sahəsidir, 'Göstərilməyib' isə mətn.
Arqumentlərin sırasını nəzərə almamaq. COALESCE() ilk NULL olmayan dəyəri qaytarır, yəni arqumentlərin sırası vacibdir.
GO TO FULL VERSION