Делюсь трюком

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Heimdallr
Сообщения: 6
Зарегистрирован: 03 авг 2005, 09:28

Делюсь трюком

Сообщение Heimdallr » 29 авг 2007, 07:59

Добрый день. Хочу поделиться фичей, которую недавно открыл для себя.

В ХП часто видел (и сам писал) последовательность кода типа:

caption=null;
select c.caption from catalog c where c.id=:id into :caption;
if(caption is null) then caption='unknown';

Вместо этого можно написать:

select coalesce(c.caption, 'unknown') from catalog c
right join rdb$database on c.id=:id
into :catalog;

Прошу прощения за отнятое время у тех, для кого подобный трюк
самоочевиден, но для кого-то из новичков этот прием может оказаться
полезным. И особенно будут полезны последующие комментарии гуру.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 29 авг 2007, 11:19

конечно последуют. а если в базе есть запись, где caption is null ?
и вообще, imho на coalesce оргазмируют обычно те, кто с null или запутался или непродумал структуру БД.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 29 авг 2007, 12:00

Код: Выделить всё

caption = 'unknown';
select caption from catalog where id=:id and caption is not null into caption;

Heimdallr
Сообщения: 6
Зарегистрирован: 03 авг 2005, 09:28

Сообщение Heimdallr » 29 авг 2007, 12:28

Если есть запись с caption is null, то и получим тот же 'unknown', так ведь? Это может быть правильным или нет, в зависимости от контекста.
А еще оргазмировать на coalesce приходится тем, кому нужно продолжать развитие проекта сколько-нибудь значительного размера.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 29 авг 2007, 12:32

Heimdallr писал(а):А еще оргазмировать на coalesce приходится тем, кому нужно продолжать развитие проекта сколько-нибудь значительного размера.
Ещё ни разу не использовал.
Проектами мерятся не будем? :D
Хотя, конечно, функция нужная, иногда.

Ответить