在Postgres存储过程中分配变量

时间:2015-01-23 17:37:53

标签: sql postgresql

我想根据频率是否大于1200000或小于1200000的条件,将interval类型的值分配给我的存储过程中名为frequency_to_add的变量。具体取决于频率,变量将是不同的,所以我可以在整个过程中使用该变量。目前我有以下内容,但它抱怨WHEN (dpl.frequency < '1200000')的语法错误有什么问题呢? (我还没有用下面代码中创建的变量替换代码)

CREATE OR REPLACE FUNCTION mo_show_slow_network()

    RETURNS TABLE(
        id            BIGINT,
        time_late_by    DOUBLE PRECISION
        )
AS
$$
DECLARE
    frequency_to_add interval; 
BEGIN
    CASE WHEN (dpl.frequency > '1200000')
            THEN frequency_to_add = 20 * interval '1 minute'
         WHEN (dpl.frequency < '1200000')
            THEN frequency_to_add = dpl.frequency * interval '1 milliseconds'

RETURN QUERY
    SELECT 
    dpl.dp_id AS dp_id,
    CASE 
         WHEN (dpl.frequency > '1200000')
            THEN EXTRACT(EPOCH FROM (current_timestamp - dpl.date_created) + 20 * interval '1 minute') 
         WHEN(dpl.frequency < '1200000')
            THEN EXTRACT(EPOCH FROM (current_timestamp - dpl.date_created) + dpl.frequency * interval '1 milliseconds')
        ELSE NULL
    END AS time_late_by

FROM -- rest of code...

1 个答案:

答案 0 :(得分:0)

您需要将变量分配给CASE表达式的结果。你不能在案件内做作业:

frequency_to_add := CASE WHEN (dpl.frequency > '1200000')
                       THEN 20 * interval '1 minute'
                    WHEN (dpl.frequency < '1200000')
                       THEN dpl.frequency * interval '1 milliseconds'
                    end;

但是仍然无法正常工作,因为作业无权访问 dbl语句后您定义的别名case

所以你实际上不能做你想做的事。您需要将case语句保留在select中。