在Postgres中创建sql函数,命令太多了

时间:2017-09-21 16:32:43

标签: sql amazon-redshift

我正在创建我的第一个sql函数,因为我想多次调用同一个查询但只是更改月份

这是我的功能

SELECT YEAR(post_date) AS y, count(ID) as posts_count
FROM fdr_posts p
WHERE 
    p.post_status = 'publish' 
    OR p.post_status = 'future' 
    AND p.post_type = 'event'
GROUP BY y
ORDER BY post_date ASC

然后我尝试调用函数

create function sevRun (string,int,int)
returns int
stable
as $$
SELECT count(*) from (
SELECT case_id,
FROM dbname.tablename 
WHERE create_date >= TO_DATE('2017-$1-01', 'YYYY-MM-DD')
AND create_date < TO_DATE('2017-$2-01', 'YYYY-MM-DD')
AND min_impact <= $3
AND assigned_to_group IN ('listitem1','listitem2',...)
end
$$language sql$$;

但是我收到以下错误

select sevRun (01,02,2);

我猜我在调用中遇到了很多Invalid operation: cannot insert multiple commands into a prepared statement; 个查询。我只想计算我的选择查询返回的行数,但我想每个月运行一次查询。

1 个答案:

答案 0 :(得分:1)

这里有很多问题。

  1. 最终的$$会搞砸了
  2. 您使用plpgsql结束end个功能,但不要使用SQL函数执行此操作。
  3. 您的子查询缺少右括号
  4. 您的子查询需要一个表别名,因为它是from子句。
  5. 您的变量插值已断开
  6. 你的意思是(string,string,int)还是(Int,int,int)?因为你似乎不一致。
  7. 您的功能应如下所示:

    create function sevRun (string,int,int)
    returns int stable as $$
    SELECT count(*) from (
        SELECT case_id,
          FROM dbname.tablename 
         WHERE create_date >= TO_DATE('2017-' || $1 || '-01', 'YYYY-MM-DD') 
               AND create_date < TO_DATE('2017-' || $2::text || '-01', 'YYYY-MM-DD')
               AND min_impact <= $3
               AND assigned_to_group IN ('listitem1','listitem2',...)
    ) inline_view
    $$language sql;