Короткий ответ
Нужно использовать CONCAT(first_name, ' ', COALESCE(last_name, '')) или оператор || в PostgreSQL, сначала заменив возможный NULL в фамилии на пустую строку через COALESCE.
Как это работает подробнее
оператор конкатенации || в PostgreSQL возвращает NULL, если хотя бы один из операндов NULL, из-за чего всё итоговое поле «пропадает»; функция CONCAT в PostgreSQL устроена мягче и обычно трактует NULL как пустую строку, но поведение может отличаться между диалектами, поэтому надёжнее явно обезопасить себя COALESCE.
Пример кода
Запрос SQL
SELECT customer_id,
CONCAT(first_name, ' ', COALESCE(last_name, '')) AS full_name
FROM customers;Что использовать на практике
- На практике: перед склеиванием текстовых полей стоит всегда продумывать: что должно получиться, если одно из полей пустое? Для отчётов обычно хотят увидеть «Иван» вместо пустой строки или
NULL, а не терять всю запись. - Результат: Для клиента с
first_name = 'Анна',last_name = NULLрезультат —'Анна '(с пробелом, который можно дополнительно обработатьTRIM). - Проверка: сравнить количество непустых
full_nameсCOUNT(*)клиентов.
Подводные камни
- Частая ошибка: используют
first_name || ' ' || last_nameбезCOALESCEи удивляются, почему часть строк в итоговом поле полностью пустая (NULL), хотя имя точно было указано.