SQL Coalesce: Retrieve Non-Null Values from Multiple Rows or Fields
SQL COALESCE - это функция, которая позволяет объединять несколько значений в одно значение. Она позволяет вернуть первое ненулевое или не NULL значение из списка значений или столбцов.
Синтаксис функции COALESCE:
COALESCE(val1, val2, ..., valn)
Где val1, val2, ..., valn - это значения или столбцы, которые нужно объединить.
Примеры использования функции COALESCE:
1. Объединение двух полей с помощью функции COALESCE:
SELECT COALESCE(first_name, '')|| ' ' || COALESCE(last_name, '') AS full_name FROM contacts;
В результате запроса, если значение поля first_name или last_name будет NULL, то функция вернет пустую строку вместо NULL.
2. Возврат первого ненулевого значения:
SELECT COALESCE(NULL, NULL, 'Hello', 20, 'world');
В данном примере, функция вернет 'Hello', так как это первое ненулевое значение из списка аргументов.
3. Объединение значений из нескольких таблиц:
SELECT COALESCE(table1.column1, table2.column2) AS result FROM table1 LEFT JOIN table2 ON table1.id = table2.id;
В данном примере, если значение поля column1 в таблице table1 будет NULL, то вместо него используется значение поля column2 из таблицы table2.
Код на SQL для проверки работы функции COALESCE:
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INTEGER NULL,
email VARCHAR(50) NULL
);
INSERT INTO users (id, name, age, email)
VALUES (1, 'John Doe', NULL, 'johndoe@example.com'),
(2, 'Jane Smith', 25, NULL),
(3, 'Bob Johnson', NULL, NULL);
-- Пример 1: Объединение двух полей с помощью функции COALESCE
SELECT COALESCE(name, '')|| ' - ' || COALESCE(email, 'No email') AS user_info
FROM users;
-- Пример 2: Возврат первого ненулевого значения
SELECT COALESCE(age, email, 'No data') AS user_data FROM users;
-- Пример 3: Объединение значений из нескольких таблиц
CREATE TABLE orders (
id INTEGER PRIMARY KEY,
user_id INTEGER NULL,
order_total NUMERIC(10, 2) NOT NULL
);
INSERT INTO orders (id, user_id, order_total)
VALUES (1, 1, 100), (2, 2, 150), (3, 3, 75), (4, NULL, 50);
SELECT users.name, COALESCE(order_total,0) AS order_total
FROM users LEFT JOIN orders
ON users.id = orders.user_id;
В результате первого запроса, функция COALESCE вернет имя пользователя и email, если он есть, в противном случае функция вернет строку 'No email'.
В результате второго запроса, функция COALESCE вернет возраст пользователя, если он есть, иначе email, если он есть, а если оба поля равны NULL, то функция вернет строку 'No data'.
В результате третьего запроса, функция COALESCE вернет имя пользователя и значение order_total из таблицы orders, если user_id существует в обоих таблицах, в противном случае функция вернет имя пользователя и значение 0.