Конкатенация строк в Firebird и пустые значения

Столкнулся с интересной ситуацией в базе данных Firebird при выводе данных из таблиц. Поведение несколько неожиданное после MySQL, поэтому понимание пришло не сразу, а только после небольшого копания. Касается сцепления строк, а также частного случая, когда в составе строк есть пустые значения.?так, в базе данных хранится три поля - имя (FIRSTNAME), отчество (SURNAME) и фамилия (LASTNAME). При запросе (или же при выводе набора данных через VIEW в Firebird) эти три поля по отдельности не нужны, хочется поле Ф?О. Что нужно? Конкатенация или сцепление. В MySQL это CONCAT(...) и это выглядело бы так:

SELECT CONCAT(LASTNAME, ' ', FIRSTNAME, ' ', SURNAME) AS NAME ...
в Firebird это оператор ||:
SELECT LASTNAME || ' ' || FIRSTNAME || ' ' || SURNAME AS NAME ...

Однако, как выяснилось, если в MySQL одно из полей пустое, то при конкатенации вместо этого поля просто будет пусто, а в Firebird - если одно из полей пустое или NULL, то и весь результат конкатенации - NULL. Т.е. если для какого-то человека из базы не введено отчество, то при выводе списка Ф?О - мы получим пустые строки в таблице.

Выход нашелся, в Firebird есть функция COALESCE(), которая возвращает первый из своих аргументов, который не пуст. Т.е. если первый аргумент не пустой  - возвращает его, если нет - смотрит второй, и т.д. по списку, и только в крайнем случае возвращает NULL. В нашем случае это:

SELECT COALESCE(LASTNAME, '') || COALESCE(' ' || FIRSTNAME, '') || COALESCE(' ' || SURNAME, '') AS NAME FROM CLIENTS
Прочитать про COALESCE() можно на сайте firebirdsql.

· Добавьте на news2.ru

Похожие записи:


2 Комментариев »

  1. Bob said,

    Октябрь 28, 2010 @ 15:48

    Спасибо за инфу.
    Я полдня голову ломал почему у меня результат null получался

  2. Mikhail said,

    Октябрь 28, 2010 @ 15:50

    Поздравляю :)

RSS feed for comments on this post · TrackBack URI.

Прокомментируйте