PostgreSQL存储了多个查询的函数

时间:2016-05-24 16:57:04

标签: sql postgresql

我正在开发一个PostgreSQL函数,但是真的很难与它竞争。这不是我的主要区域,所以这可能是原因,但我想知道这是否可行。

我正在尝试创建一个基于年份生成记录的函数。

在php中,我会做一些事情:

function recordsByYear($year=''){
    $years = array();
    if(empty($year)){
        $sql = "SELECT year FROM myTable GROUP BY year ORDER BY year;";
        $res = $conn->query($sql);
        if($res !== false){
            $data = $res->fetchAll(PDO::FETCH_COLUMN);
            foreach($data as $oneYear){
                $years[] = $oneYear;
            }
        }
    }
    else{
        $years[] = $year;
    }

    foreach($years as $thisYear){
    //do some queries based on $thisYear
    }
}

但我想在PostgreSQL中创建一个函数,并且因为我对它的工作方式不够熟悉而苦苦挣扎。我想退一张桌子。我可以做一些基本的东西,但是无法得到这样的东西工作,我有一个查询然后循环这些结果运行每年的额外查询,然后结合第二个查询的结果并吐出结果作为一张桌子。

2 个答案:

答案 0 :(得分:0)

如果没有更多信息很难猜测,但您可能需要加入

SELECT *
FROM ( 
       SELECT DISTINCT year
       FROM myTable 
     ) y 
JOIN ( SELECT year, ... <some query>  
      ....
     ) t
  ON y.year = t.year

答案 1 :(得分:0)

PostgreSQL功能:

CREATE FUNCTION record_years() RETURNS SETOF int AS $$
  SELECT DISTINCT year FROM myTable ORDER BY 1
$$ LANGUAGE SQL;

您的PHP代码:

$sql = "SELECT record_years()";

$sql = "SELECT year FROM record_years() AS year";

或者单行中的所有值,作为JSON数组:

$sql = "SELECT array_to_json(ARRAY(SELECT record_years())) AS arr";
$res = $conn->query($sql);
if($res !== false){
  $row = $res->fetch();      
  $years[] = json_decode($row['arr']);
}