Re: [GENERAL] Needed function IF(expr, expr, expr)

Поиск
Список
Период
Сортировка
От Greg Stark
Тема Re: [GENERAL] Needed function IF(expr, expr, expr)
Дата
Msg-id 87llt06w7g.fsf@stark.dyndns.tv
обсуждение исходный текст
Ответ на Re: [GENERAL] Needed function IF(expr, expr, expr)  (Tom Lane <tgl@sss.pgh.pa.us>)
Ответы Re: [GENERAL] Needed function IF(expr, expr, expr)  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-hackers
> However, as of 7.4, that problem is gone too.  If you write the function
> just as above (language sql, volatile, not strict) then the planner will
> inline it and indeed what you get is a CASE.  Watch this:

Hm. I wonder if there are cases of people using functions like this with
user-defined volatile functions depending on the function's side effects
happening the correct number of times. Or do volatile functions not get
inlined like this?

> So we do actually have a sort-of-credible way to make a user-defined
> function that emulates IF().  I think we might be able to do Oracle's
> DECODE() as well, though I don't know its exact definition.  (You'd
> still need to make several of 'em to handle differing numbers of
> arguments, but that seems well within the bounds of feasibility.)

I think there's a problem implementing decode() surrounding NULL:

SELECT decode(col, 'foo', 1, NULL, 2, 3)

would mean:

SELECT CASE WHEN col='foo' THEN 1           WHEN col IS NULL THEN 2           ELSE 3      END

To do it I think you would need a iseq() function that compared NULLs as being
equal.

-- 
greg



В списке pgsql-hackers по дате отправления:

Предыдущее
От: Bruce Momjian
Дата:
Сообщение: Re: Index creation takes for ever
Следующее
От: "Jenny -"
Дата:
Сообщение: Re: table-level and row-level locks.