在 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
语句原样。
我想根据频率大于 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
语句原样。