Gəlin bu sirli NULL ilə işləmək üçün daha bir funksiya haqqında danışaq — NULLIF(). Bu funksiya bizə bəzi dəyərləri NULL-a çevirmək lazım olanda kömək edir ki, dataları düzgün işləyə bilək. Kəmərləri bağla, maraqlı bir səyahət olacaq!
NULLIF() funksiyası PostgreSQL-də əla bir alətdir, iki dəyəri müqayisə etməyə və əgər onlar eynidirsə NULL, yox əgər fərqlidirsə birinci dəyəri qaytarmağa imkan verir. Sanki deyir: "Əgər bu dəyərlər eynidirsə, onları unudaq!"
Funksiyanın sadə sintaksisi belədir:
NULLIF(value1, value2)
Əgər value1 və value2 bərabərdirsə, nəticə NULL olacaq. Əgər fərqlidirsə, nəticə value1 olacaq.
Nümunə:
SELECT NULLIF(10, 10); -- Nəticə: NULL
SELECT NULLIF(10, 20); -- Nəticə: 10
SELECT NULLIF('hello', 'hello'); -- Nəticə: NULL
SELECT NULLIF('hello', 'world'); -- Nəticə: 'hello'
Sadədir, düzdür? İndi isə bu funksiyanı real tapşırıqlarda necə istifadə edə biləcəyimizə baxaq.
Nümunə 1: Sıfıra bölmənin qarşısını almaq
Sıfıra bölmə — hər bir proqramçının kabusudur. SQL-də sıfıra bölmək cəhd etsən, səhv çıxacaq. Bax burada NULLIF() köməyə gəlir.
Təsəvvür elə ki, bizdə sales adlı cədvəl var, iki sütunla: revenue (gəlir) və expenses (xərc). Biz xərclərin rentabelliyini (revenue / expenses) hesablamaq istəyirik, amma bəzən xərclər sıfır olur. Əgər heç bir yoxlama olmadan sorğunu işlətsək, sıfıra bölmə səhvi alacağıq.
sales cədvəli:
| revenue | expenses |
|---|---|
| 1000 | 200 |
| 1500 | 0 |
| 2000 | 250 |
Səhvli sorğu:
SELECT revenue / expenses AS profitability
FROM sales;
-- Səhv: sıfıra bölmə!
NULLIF() ilə həll:
SELECT revenue / NULLIF(expenses, 0) AS profitability
FROM sales;
Nəticə:
| profitability |
|---|
| 5.00 |
| NULL |
| 8.00 |
İndi əgər expenses sıfırdırsa, NULLIF(expenses, 0) NULL qaytarır və NULL-a bölmə səhv vermir, sadəcə NULL qaytarır.
Nümunə 2: Eyni dəyərləri NULL ilə əvəzləmək
Təsəvvür elə ki, səndə tələbələr haqqında cədvəl var, orada first_name və preferred_name sütunları var. Bəzən tələbə öz adını üstün tutur, bəzən başqa bir ad seçir. Əgər hər iki ad eynidirsə, preferred_name-i göstərməyə ehtiyac yoxdur.
students cədvəli:
| first_name | preferred_name |
|---|---|
| John | Johnny |
| Anna | Anna |
| Alex | Lex |
NULLIF() ilə sorğu:
SELECT first_name,
NULLIF(preferred_name, first_name) AS display_name
FROM students;
Nəticə:
| first_name | display_name |
|---|---|
| John | Johnny |
| Anna | NULL |
| Alex | Lex |
Əgər preferred_name və first_name eynidirsə, nəticə NULL olacaq.
Nümunə 3: Datada filtrasiya
Bəzən iki sütundakı dəyərlər fərqlidirsə, yalnız o sətrləri seçmək lazımdır. Məsələn, bizdə original_price və discounted_price olan sifarişlər cədvəli var. Endirim tətbiq olunan sifarişləri tapmaq istəyirik.
orders cədvəli:
| order_id | original_price | discounted_price |
|---|---|---|
| 1 | 100 | 100 |
| 2 | 200 | 180 |
| 3 | 150 | 150 |
NULLIF() ilə sorğu:
SELECT order_id, original_price, discounted_price
FROM orders
WHERE NULLIF(original_price, discounted_price) IS NOT NULL;
Nəticə:
| order_id | original_price | discounted_price |
|---|---|---|
| 2 | 200 | 180 |
Yalnız endirimli sifarişlər nəticəyə düşdü.
NULLIF() istifadə üçün praktiki hallar
Hal 1: Opsional dəyər seçimi
Datayla işləyəndə bəzən bir neçə sütundan dəyər seçmək lazımdır, amma müəyyən dəyərləri istisna etmək istəyirik. Məsələn, bizdə işçilərin siyahısı var: base_salary və bonus. Əgər bonus sıfırdırsa, onu 999 kimi götürmək istəyirik.
employees cədvəli:
| employee_id | base_salary | bonus |
|---|---|---|
| 1 | 50000 | 10000 |
| 2 | 40000 | 0 |
| 3 | 60000 | 5000 |
NULLIF() ilə sorğu:
SELECT employee_id,
base_salary + COALESCE(NULLIF(bonus, 0), 999) AS total_salary
FROM employees;
Nəticə:
| employee_id | total_salary |
|---|---|
| 1 | 60000 |
| 2 | 40999 |
| 3 | 65000 |
Əgər bonus sıfırdırsa, o 999 olur.
Hal 2: Sətirlərin sayılması
NULLIF() funksiyasını mürəkkəb filtrasiya şərtlərini sadələşdirmək üçün istifadə edə bilərik. Məsələn, bizdə istifadəçilər cədvəli var və bir sorğu ilə həm ümumi istifadəçi sayını, həm də qeydiyyatdan keçmiş istifadəçilərin (statusu guest olmayan) sayını tapmaq istəyirik.
SELECT
COUNT(*) AS total_users,
COUNT(NULLIF(status, 'guest')) AS registered_users
FROM users;
Beləliklə, cəmi bir NULLIF() funksiyası ilə bir çox problemi həll edə bilərik: səhvlərin qarşısını almaqdan tutmuş kodun oxunaqlılığını artırmağa qədər. Artıq necə işlədiyini bildiyinə görə, PostgreSQL-də datayla işləməkdə bir addım daha peşəkarsan.
GO TO FULL VERSION