Конкантенация строк и NULL

Делаем например склейку полей в одно ФИО:
(((c.fio_f::text || ' '::text) || c.fio_i::text) || ' '::text) || c.fio_o::text AS fio

Если хотя бы одно из значений NULL, то вся строчка будет NULL, что не есть хорошо.

Как эту проблему обойти?

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Отвечаю сам себе

http://www.postgresql.org/docs/8.3/interactive/functions-conditional.html

9.16.2. COALESCE

COALESCE(value [, ...])

The COALESCE function returns the first of its arguments that is not null (Функция COALESCE возвращает первый аргумент не null). Null is returned only if all arguments are null (Null возвращается только если все аргументы null). It is often used to substitute a default value for null values when data is retrieved for display, for example (Это часто используется для того, чтобы заменить отсутствующие данные по умолчанию при попытке их отобразить, например):

SELECT COALESCE(description, short_description, '(none)') ...

т.е. в моем примере:

SELECT (COALESCE(c.fio_f,'') || ' ' || COALESCE(c.fio_i,'') || ' ' || COALESCE(c.fio_o,'')) AS fio

Конкатенация через CONCAT

Вариант с COALESCE неудобен, на мой взгляд, тем, что типы аргументов должны совпадать. Удобнее использовать CONCAT, автоматически фильтрующий NULL-значения.
SELECT CONCAT(c.fio_f, ' ', c.fio_i, ' ', c.fio_o) AS fio

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023