PostgreSQL条件选择

时间:2010-02-18 13:49:32

标签: postgresql function conditional

我编写了一个递归函数,根据输出我需要选择不同的字段。我现在的问题是,我怎么能多次这样做而不必再调用一次这个函数呢?我现在正在做的只是使用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 个答案:

答案 0 :(得分:2)

使用子查询:

SELECT foo, bar, result
FROM (
SELECT ..., function(id) AS result
....
) as tmp

答案 1 :(得分:2)

如果函数声明为IMMUTABLE,则可以安全地多次调用它,因为它不会被重新评估。

来自docs

  

IMMUTABLE表示该函数无法修改数据库,并且在给定相同的参数值时始终返回相同的结果;也就是说,它不进行数据库查找或以其他方式使用不直接出现在其参数列表中的信息。如果给出此选项,则可以使用函数值立即替换具有全常量参数的函数的任何调用。

答案 2 :(得分:1)

您可以使用一些时髦的元组,例如:

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

但我对此语法没有经验