Sql 在Postgres存储过程中指定一个变量

Sql 在Postgres存储过程中指定一个变量,sql,postgresql,Sql,Postgresql,我想根据频率是大于1200000还是小于1200000的条件,为存储过程中名为frequency_to_add的变量分配一个interval type的值。根据频率的不同,变量会有所不同,因此我可以在整个过程中使用该变量。目前我有以下内容,但它抱怨dpl.frequency

我想根据频率是大于1200000还是小于1200000的条件,为存储过程中名为frequency_to_add的变量分配一个interval type的值。根据频率的不同,变量会有所不同,因此我可以在整个过程中使用该变量。目前我有以下内容,但它抱怨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语句不变。

我将在两个EXTRACT语句中使用该变量,但您在代码中的该点无法访问dbl。所以你不能一开始就分配变量。明白了,测试并实现了它