我正在构建一个报表查询,它在计算列中有很多重复的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中实现这一目标的其他任何替代方案?
答案 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 ...