PostgreSQL 函数执行查询
PostgreSQL function execute query
如果满足条件,我想运行查询SQL,但出现以下错误:
错误:一个单独的 $ 链在 «$func$
中或附近未完成
我的SQL查询是:
CREATE OR REPLACE FUNCTION myfunc()
RETURNS TABLE(dateticket date, timeticket time, userid integer, my_all bigint) AS
$func$
BEGIN
IF (SELECT COUNT(DISTINCT(dateticket)) from tickets) = 1 THEN
RETURN QUERY EXECUTE 'select t.*
from (select distinct on (userid) dateticket, timeticket, userid,
count(*) over (partition by userid) as my_all
from tickets t
order by userid, dateticket, timeticket) t
order by my_all, dateticket, timeticket';
ELSE
RETURN QUERY EXECUTE 'select t.*
from (select distinct on (userid) dateticket, timeticket, userid,
count(*) over (partition by userid) as my_all
from tickets t
order by userid, dateticket, timeticket) t
order by my_all DESC, dateticket DESC, timeticket DESC';
END IF;
END;
$$ LANGUAGE plpgsql;
错误实际上与条件或函数本身的任何内容无关,而是函数创建的语法。函数定义以 $func$
开始,以 $$
结束。这行不通。
将 $func$
更改为 $$
以修复语法。
你在函数中有两个错误,一个已经回答,另一个是 RETURN table 的列与列名相同在函数内部使用的 select 查询中,这将导致
ERROR: column reference "dateticket" is ambiguous LINE 1: (SELECT
COUNT(DISTINCT(dateticket)) from tickets) = 1
^ DETAIL: It could refer to either a PL/pgSQL variable or a table column. QUERY: (SELECT
COUNT(DISTINCT(dateticket)) from tickets) = 1 CONTEXT: PL/pgSQL
function myfunc() line 3 at IF
********** Error **********
所以你需要像下面这样修改你的函数
CREATE OR REPLACE FUNCTION myfunc()
RETURNS TABLE(datet_icket date, time_ticket time, user_id integer, myall bigint) AS
$$
BEGIN
IF (SELECT COUNT(DISTINCT(dateticket)) from tickets) = 1 THEN
RETURN QUERY EXECUTE 'select t.*
from (select distinct on (userid) dateticket, timeticket, userid,
count(*) over (partition by userid) as my_all
from tickets t
order by userid, dateticket, timeticket) t
order by my_all, dateticket, timeticket';
ELSE
RETURN QUERY EXECUTE 'select t.*
from (select distinct on (userid) dateticket, timeticket, userid,
count(*) over (partition by userid) as my_all
from tickets t
order by userid, dateticket, timeticket) t
order by my_all DESC, dateticket DESC, timeticket DESC';
END IF;
END;
$$ LANGUAGE plpgsql;
如果满足条件,我想运行查询SQL,但出现以下错误:
错误:一个单独的 $ 链在 «$func$
中或附近未完成我的SQL查询是:
CREATE OR REPLACE FUNCTION myfunc()
RETURNS TABLE(dateticket date, timeticket time, userid integer, my_all bigint) AS
$func$
BEGIN
IF (SELECT COUNT(DISTINCT(dateticket)) from tickets) = 1 THEN
RETURN QUERY EXECUTE 'select t.*
from (select distinct on (userid) dateticket, timeticket, userid,
count(*) over (partition by userid) as my_all
from tickets t
order by userid, dateticket, timeticket) t
order by my_all, dateticket, timeticket';
ELSE
RETURN QUERY EXECUTE 'select t.*
from (select distinct on (userid) dateticket, timeticket, userid,
count(*) over (partition by userid) as my_all
from tickets t
order by userid, dateticket, timeticket) t
order by my_all DESC, dateticket DESC, timeticket DESC';
END IF;
END;
$$ LANGUAGE plpgsql;
错误实际上与条件或函数本身的任何内容无关,而是函数创建的语法。函数定义以 $func$
开始,以 $$
结束。这行不通。
将 $func$
更改为 $$
以修复语法。
你在函数中有两个错误,一个已经回答,另一个是 RETURN table 的列与列名相同在函数内部使用的 select 查询中,这将导致
ERROR: column reference "dateticket" is ambiguous LINE 1: (SELECT COUNT(DISTINCT(dateticket)) from tickets) = 1 ^ DETAIL: It could refer to either a PL/pgSQL variable or a table column. QUERY: (SELECT COUNT(DISTINCT(dateticket)) from tickets) = 1 CONTEXT: PL/pgSQL function myfunc() line 3 at IF ********** Error **********
所以你需要像下面这样修改你的函数
CREATE OR REPLACE FUNCTION myfunc()
RETURNS TABLE(datet_icket date, time_ticket time, user_id integer, myall bigint) AS
$$
BEGIN
IF (SELECT COUNT(DISTINCT(dateticket)) from tickets) = 1 THEN
RETURN QUERY EXECUTE 'select t.*
from (select distinct on (userid) dateticket, timeticket, userid,
count(*) over (partition by userid) as my_all
from tickets t
order by userid, dateticket, timeticket) t
order by my_all, dateticket, timeticket';
ELSE
RETURN QUERY EXECUTE 'select t.*
from (select distinct on (userid) dateticket, timeticket, userid,
count(*) over (partition by userid) as my_all
from tickets t
order by userid, dateticket, timeticket) t
order by my_all DESC, dateticket DESC, timeticket DESC';
END IF;
END;
$$ LANGUAGE plpgsql;