在 Postgres 存储过程中分配变量

Assign a variable in Postgres stored procedure

我想根据频率大于 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...

您需要将变量分配给 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;

但这仍然行不通,因为赋值无法访问您在 case 语句 之后定义的别名 dbl

所以你实际上不能那样做你想做的事。您需要保持 select 中的 case 语句原样。