【问题标题】:Call a function or view with a parameter带参数调用函数或视图
【发布时间】:2015-05-13 09:42:05
【问题描述】:

我想创建功能或视图,每月显示特定年份的一些信息。

CREATE OR REPLACE VIEW name_view AS 
    SELECT d_name,
    SUM("Jan") "Jan",
    SUM("Feb") "Feb"
    ...
    FROM (
    select distinct d_name,
      COUNT(CASE WHEN EXTRACT (MONTH FROM h_date) = '01' THEN query_string ELSE NULL END) "Jan",
      COUNT(CASE WHEN EXTRACT (MONTH FROM h_date) = '02' THEN query_string ELSE NULL END) "Feb",
    ..
       from h
           inner join d on h_d = d_id
                WHERE EXTRACT (YEAR FROM h_date) = '2015' 
            GROUP BY  d_name) sub query
    GROUP BY d_name

没有

我怎么能这样调用视图

WHERE EXTRACT (YEAR FROM h_date) = '2015'

但是电话的年份呢?例如

SELECT * FROM name_view ('2015')

【问题讨论】:

  • 创建一个返回表格的函数。
  • 你应该创建一个存储过程而不是@@"

标签: sql windows postgresql


【解决方案1】:

您应该在 SELECT 中使用 YEAR,当您从视图中选择时使用 WHERE year = 2015。

CREATE OR REPLACE VIEW name_view AS 
SELECT d_name,
SUM("Jan") "Jan",
SUM("Feb") "Feb",
YEAR,
....

视图的使用:

SELECT * 
FROM name_view 
WHERE year = '2015';

【讨论】:

    【解决方案2】:

    你可以试试这个函数传递日期作为参数:

    CREATE OR REPLACE FUNCTION "show_info"("DATE" date)
      RETURNS SETOF show_info AS
    $BODY$SELECT d_name,
        SUM("Jan") "Jan",
        SUM("Feb") "Feb"
        ...
        FROM (
        select distinct d_name,
          COUNT(CASE WHEN EXTRACT (MONTH FROM h_date) = '01' THEN query_string ELSE NULL END) "Jan",
          COUNT(CASE WHEN EXTRACT (MONTH FROM h_date) = '02' THEN query_string ELSE NULL END) "Feb",
        ..
           from h
               inner join d on h_d = d_id
                    WHERE EXTRACT (YEAR FROM h_date) = $1 
                GROUP BY  d_name) subquery
        GROUP BY d_name
    ;$BODY$
      LANGUAGE sql VOLATILE
      COST 100
      ROWS 1000;
    

    你可以这样称呼它

    select * from show_info(date)
    

    这里的日期将是您想要通过的任何日期

    【讨论】:

    • 这个函数会失败,“SHOW_INFO”和“show_info”不一样。建议:不要使用双引号 " 并且不要将大写字符用于函数名称等对象名称。
    • @FrankHeikens 我编辑了我的答案。我删除了双引号并将函数名称更改为小写字母。谢谢指正:)
    猜你喜欢
    • 2020-02-13
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多