Конкатенация строк в 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
Похожие записи:
- Визуальное моделирование базы данных с экспортом в Firebird
- Избавление от ошибки в menu.inc on line 315 при установке Drupal 6.3
- Установка множественных блогов на базе Wordpress
- Создание виджетов для Wordpress
- В США мать вызвала полицию сыну, который раньше времени открыл свой рождественский подарок


