PostgreSQL有条件的选择

问题描述:

我写了一个递归函数,根据输出我需要选择不同的字段。我现在的问题是,如何多次执行此操作而不必多次调用该函数?我现在正在做的就是使用CASE WHEN...条件并每次检查函数返回的结果。 (这只是一个伪代码,并没有做任何事情真实的,它只是为了理解)PostgreSQL有条件的选择

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 
... 

如何优化这个查询和调用该函数只有一次? 在此先感谢!

+0

有什么功能的语言没有什么经验? – 2010-02-18 13:51:02

+0

语言是PL/pgSQL。 – stefita 2010-02-18 14:02:45

+0

您接受使用IMMUTABLE的答案很奇怪,但您在评论中说您的函数“从另一个表中选择了一个值,并且可以为该特定ID进行更改”。我希望你没有标记IMMUTABLE函数,因为Postgres没有说它缓存了不可变函数结果的时间。 – 2010-03-03 11:29:38

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

docs

IMMUTABLE表示该函数不能修改数据库,并给出了相同的参数值时总是返回相同的结果;也就是说,它不会执行数据库查找或以其他方式使用不直接存在于其参数列表中的信息。如果给出这个选项,任何具有所有常量参数的函数调用都可以立即替换为函数值。

+0

如果相同参数的结果发生变化,会发生什么? – stefita 2010-02-18 14:05:07

+0

@stefita:您不应该将这些功能标记为“IMMUTABLE”。 http://www.postgresql.org/docs/current/static/xfunc-volatility.html – Quassnoi 2010-02-18 14:14:02

+0

@stefita:你的意思是像clock_timestamp()?然后你声明它是VOLATILE,Postgres每次看到它时都会调用它。还有什么可能呢?但你的例子看起来像函数(id)返回相同的东西,但你需要它来选择3个不同的字段 – 2010-02-18 14:14:11

使用子查询:

​​

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

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

,但我有这个语法