【问题标题】:Working with where clauses inside views在视图中使用 where 子句
【发布时间】:2014-10-23 01:31:31
【问题描述】:
CREATE VIEW summary AS  
SELECT sales.inventory_id,
       sum(sales.value) AS value,
       count(sales.*) AS sales_n,
FROM promotion
JOIN sales USING (promotion_id)
GROUP BY sales.inventory_id
;
  1. 这是我正在处理的问题的简化查询
  2. 但是,我希望能够将WHERE 子句添加到视图中。像这样WHERE promotion.created_at > ?

问题:

我应该如何修改视图以便我可以做这样的事情:

SELECT * 
FROM summary 
WHERE promotion.created_at > [timestamp]

我目前无法执行此操作,因为 inventory_id 上有一个 GROUP BY,所以 promotion.created_at 未被捕获

【问题讨论】:

    标签: sql postgresql stored-procedures view parameter-passing


    【解决方案1】:

    使用SQL函数代替时间戳作为参数:

    CREATE FUNCTION summary(_created_at timestamp)
      RETURNS TABLE (inventory_id int, value bigint, sales_n int)
    AS
    $func$
    SELECT s.inventory_id
         , sum(s.value) -- AS value  -- alias not visible outside function
         , count(*)     -- AS sales_n
    FROM   promotion p
    JOIN   sales     s USING (promotion_id)
    WHERE  p.created_at > $1
    GROUP  BY s.inventory_id
    $func$ LANGUAGE sql STABLE;
    

    呼叫:

    SELECT * FROM summary('2014-06-01 10:00');
    

    我使用表别名缩短了语法。
    count(*) 与此处的count(s.*) 相同。
    使 RETURNS TABLE(...) 适应您的实际数据类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-15
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      • 1970-01-01
      相关资源
      最近更新 更多