PostgreSQL Условный выбор - PullRequest
       53

PostgreSQL Условный выбор

1 голос
/ 18 февраля 2010

Я написал рекурсивную функцию и в зависимости от вывода мне нужно выбрать разные поля.Мой вопрос сейчас, как я могу сделать это несколько раз, не вызывая функцию более одного раза?Сейчас я просто использую условие CASE WHEN... и проверяю каждый раз, что возвращают функции.(Это всего лишь псевдокод и ничего реального не делает, просто для понимания)

SELECT
id,
(CASE WHEN (function(id) > 0)
    THEN field1
    ELSE field2
END) as value1,
(CASE WHEN (function(id) > 0)
    THEN field3
    ELSE field4
END) as value2,
(CASE WHEN (function(id) > 0)
    THEN field5
    ELSE field6
END) as value3
FROM table1
...

Как я могу оптимизировать этот запрос и вызвать функцию только один раз?Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 18 февраля 2010

Если функция объявлена ​​IMMUTABLE, ее можно вызывать много раз, поскольку она не будет переоценена.

Из документов :

IMMUTABLE указывает, что функция не может изменить базу данных и всегда возвращает один и тот же результат, если даны одинаковые значения аргумента; то есть он не выполняет поиск в базе данных или иным образом не использует информацию, непосредственно не представленную в его списке аргументов. Если указан этот параметр, любой вызов функции с полностью константными аргументами может быть немедленно заменен значением функции.

2 голосов
/ 18 февраля 2010

использовать подзапрос:

SELECT foo, bar, result
FROM (
SELECT ..., function(id) AS result
....
) as tmp
1 голос
/ 18 февраля 2010

Вы можете использовать что-то напуганное, например:

SELECT id,
CASE WHEN function(id) > 0
    THEN (field1, field3, field5)
    ELSE (field2, field4, field6)
END as (value1, value2, value3)

, но у меня нет опыта работы с этим синтаксисом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...