在计算列中使用pl / pgsql变量

时间:2018-02-21 17:25:46

标签: postgresql plpgsql postgresql-9.5

我正在构建一个报表查询,它在计算列中有很多重复的const值。简化示例:

select
    c.title || ' corp', -- more than one column appending this
    to_char(c.last_contact, 'YYYY-MM-DD HH24:MI') -- this format is used for other columns as well
from clients c;

我想将重复的const值提取到变量中,而是使用变量。在TSQL中,我可以使用以下代码实现它:

declare
    @suffix varchar(8) = ' corp',
    @dateFormat varchar(16) = 'YYYY-MM-DD HH24:MI' -- let's pretend that's a correct format string for TSQL

select
    c.title + @suffix,
    convert(varchar(32), c.last_contact, @dateFormat)
from clients c

我试图在pl / pgsql中实现相同的行为:

do $$
declare
    suffix text := ' corp';
    date_format text := 'YYYY-MM-DD HH24:MI';
begin
    select
        c.title || suffix,
        to_char(c.last_contact, date_format)
    from clients c;
end;
$$;

它打破了:

ERROR: query has no destination for result data
  Hint: If you want to discard the results of a SELECT, use PERFORM instead.
  Where: PL/pgSQL function inline_code_block line 5 at SQL statement
1 statement failed.

到目前为止,我只找到了在WHERE块中使用变量的示例,但在SELECT块中没有。

我已经看过EXECUTE 'select ...' WITH个例子,但我很快尝试使用

do $$
declare
    process_start timestamp := now();
begin
    execute 'select $1;'    
    using process_start;
end;
$$;

只报告DO executed successfully而不实际选择任何内容。

有没有办法在计算列中使用pl / pgsql变量?

在postgres中实现这一目标的其他任何替代方案?

2 个答案:

答案 0 :(得分:0)

你想用这个值做什么?令人费解的例子。 使用FUNCTION可以或多或少地解决这个问题

create or replace function my_function()
returns timestamp as $$
declare
    process_start timestamp := now();
begin
    return process_start;
end;
$$
language plpgsql

如果您确实要忽略代码中唯一选择的结果,可以使用PERFORM

do $$
declare
    process_start timestamp := now();
begin
    perform (select process_start);
end;
$$;

答案 1 :(得分:0)

要在PL / pgSQL中使用SELECT,您必须指定INTO子句:

SELECT process_start, s.title || suffix
   INTO var1, var2
   FROM ...