Пошук уроків, статей та іншого контенту
Зрозумієте особливості NULL і перевірятимете відсутні значення за допомогою IS NULL та IS NOT NULL.
NULLNULL у PostgreSQL означає, що значення:
відсутнє;
невідоме;
ще не задане;
не застосовується до конкретного запису.
NULL — це не:
0;
порожній рядок '';
false;
текстове значення 'NULL'.
Наприклад, у таблиці користувачів дата завершення підписки може бути NULL, якщо користувач ще не скасував підписку:
id | username | subscription_ended_at
---+----------+-----------------------
1 | anna | 2025-01-10
2 | petro | NULLДля користувача petro значення subscription_ended_at відсутнє.
Розглянемо таблицю співробітників:
CREATE TEMP TABLE employees (
id integer,
name text,
email text,
department text
);
INSERT INTO employees (id, name, email, department)
VALUES
(1, 'Анна', 'anna@example.com', 'Розробка'),
(2, 'Петро', NULL, 'Підтримка'),
(3, 'Олена', 'olena@example.com', NULL),
(4, 'Ігор', NULL, NULL);У цій таблиці:
у Петра відсутня електронна пошта;
в Олени не вказано відділ;
в Ігоря відсутні і пошта, і відділ.
= NULLДля перевірки NULL не використовують оператор =:
-- Неправильно
SELECT *
FROM employees
WHERE email = NULL;Такий запит не знайде рядки з відсутньою електронною поштою.
Причина полягає в тому, що NULL не є звичайним значенням. Порівняння будь-якого значення з NULL дає не TRUE і не FALSE, а UNKNOWN — невідомий результат.
NULL = NULL
NULL = 'anna@example.com'
NULL <> 'anna@example.com'Усі ці порівняння мають результат UNKNOWN.
Умова WHERE повертає лише рядки, для яких результат умови дорівнює TRUE. Результати FALSE та UNKNOWN не проходять фільтр.
IS NULLОператор IS NULL перевіряє, чи є значення відсутнім.
SELECT *
FROM employees
WHERE email IS NULL;Результат:
id | name | email | department
---+-------+-------+-----------
2 | Петро | NULL | Підтримка
4 | Ігор | NULL | NULLЩоб знайти записи без указаного відділу:
SELECT name
FROM employees
WHERE department IS NULL;Результат:
name
-----
Олена
ІгорIS NULL повертає TRUE, якщо значення відсутнє, і FALSE, якщо значення існує.
IS NOT NULLОператор IS NOT NULL перевіряє, чи значення існує.
SELECT *
FROM employees
WHERE email IS NOT NULL;Результат:
id | name | email | department
---+-------+-------------------+-----------
1 | Анна | anna@example.com | Розробка
3 | Олена | olena@example.com | NULLЩоб знайти співробітників із вказаним відділом:
SELECT name, department
FROM employees
WHERE department IS NOT NULL;Результат:
name | department
------+-----------
Анна | Розробка
Петро | ПідтримкаNULL у логічних умовахПід час роботи з NULL PostgreSQL використовує три можливі результати логічних виразів:
TRUE — істина;
FALSE — хиба;
UNKNOWN — невідомо.
Наприклад:
SELECT
NULL = 10 AS equal_result,
NULL <> 10 AS not_equal_result,
NULL IS NULL AS is_null_result,
NULL IS NOT NULL AS is_not_null_result;Результат:
equal_result | not_equal_result | is_null_result | is_not_null_result
-------------+------------------+----------------+-------------------
NULL | NULL | true | falseУ перших двох виразах результатом буде NULL, який у цьому випадку представляє невідомий результат порівняння. Оператори IS NULL та IS NOT NULL повертають звичайне логічне значення true або false.
ANDЯкщо всі умови мають бути істинними, можна поєднувати IS NULL та IS NOT NULL через AND.
SELECT *
FROM employees
WHERE email IS NULL
AND department IS NULL;Цей запит знайде співробітників, у яких одночасно відсутні електронна пошта та відділ.
Результат:
id | name | email | department
---+------+-------+-----------
4 | Ігор | NULL | NULLORЯкщо достатньо, щоб не було хоча б одного зі значень, використовуйте OR.
SELECT *
FROM employees
WHERE email IS NULL
OR department IS NULL;Запит знайде співробітників, у яких відсутня електронна пошта або відділ.
Результат:
id | name | email | department
---+-------+-------------------+-----------
2 | Петро | NULL | Підтримка
3 | Олена | olena@example.com | NULL
4 | Ігор | NULL | NULLNULL і порожній рядокПорожній рядок '' — це текстове значення довжиною нуль символів. Він відрізняється від NULL.
SELECT
'' IS NULL AS empty_string_is_null,
NULL IS NULL AS null_is_null;Результат:
empty_string_is_null | null_is_null
---------------------+-------------
false | trueТому запит:
SELECT *
FROM employees
WHERE email IS NULL;не знайде рядки, у яких email дорівнює порожньому рядку:
''Якщо в даних потрібно знайти і NULL, і порожні рядки, умови треба вказати окремо:
SELECT *
FROM employees
WHERE email IS NULL
OR email = '';Утім, це не означає, що NULL і порожній рядок завжди потрібно вважати одним і тим самим. Вибір залежить від правил конкретної програми та структури даних.
NULL і нульЧисло 0 є звичайним числовим значенням, а NULL означає його відсутність.
SELECT
0 IS NULL AS zero_is_null,
NULL IS NULL AS null_is_null;Результат:
zero_is_null | null_is_null
-------------+-------------
false | trueНаприклад, у таблиці товарів:
price = 0 може означати, що товар безкоштовний;
price IS NULL може означати, що ціну ще не визначено.
Це різні ситуації, тому їх потрібно обробляти окремо.
NULL у результатах запитівЯкщо вибрати стовпець, що містить NULL, PostgreSQL покаже NULL у результаті:
SELECT name, email
FROM employees
ORDER BY id;Результат:
name | email
------+-------------------
Анна | anna@example.com
Петро | NULL
Олена | olena@example.com
Ігор | NULLNULL також може з’явитися у виразі. Наприклад, додавання числа до NULL не дає число:
SELECT 100 + NULL AS result;Результат буде NULL, оскільки PostgreSQL не може визначити результат операції з невідомим значенням.
Нижче наведено самодостатній приклад, який можна виконати в PostgreSQL:
CREATE TEMP TABLE orders (
id integer,
customer_name text,
shipped_at timestamp,
tracking_number text
);
INSERT INTO orders (id, customer_name, shipped_at, tracking_number)
VALUES
(1, 'Анна', '2025-03-01 10:00:00', 'UA123'),
(2, 'Петро', NULL, NULL),
(3, 'Олена', '2025-03-02 12:30:00', NULL);
-- Замовлення, які ще не відправлено
SELECT *
FROM orders
WHERE shipped_at IS NULL;
-- Замовлення, які вже відправлено
SELECT *
FROM orders
WHERE shipped_at IS NOT NULL;
-- Замовлення без номера відстеження
SELECT *
FROM orders
WHERE tracking_number IS NULL;
-- Замовлення, які ще не відправлено або не мають номера відстеження
SELECT *
FROM orders
WHERE shipped_at IS NULL
OR tracking_number IS NULL;= NULL-- Неправильно
WHERE tracking_number = NULLПотрібно використовувати:
WHERE tracking_number IS NULL<> NULL-- Неправильно
WHERE tracking_number <> NULLПотрібно використовувати:
WHERE tracking_number IS NOT NULLNULL і порожнім рядкомWHERE email IS NULLЦя умова не знаходить email = ''. Якщо потрібно перевірити обидва випадки:
WHERE email IS NULL
OR email = '';NULL і нулемWHERE amount = 0Це знаходить лише записи зі значенням 0, але не записи з NULL.
Для пошуку відсутніх числових значень:
WHERE amount IS NULLNULL означає відсутнє або невідоме значення.
NULL не дорівнює 0, порожньому рядку чи false.
Для перевірки відсутнього значення використовуйте IS NULL.
Для перевірки наявного значення використовуйте IS NOT NULL.
Не використовуйте = NULL або <> NULL.
Порівняння зі NULL дають невідомий результат, тому звичайні оператори порівняння для нього не підходять.
NULL і порожній рядок потрібно перевіряти окремими умовами.