我正在开发一个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中创建一个函数,并且因为我对它的工作方式不够熟悉而苦苦挣扎。我想退一张桌子。我可以做一些基本的东西,但是无法得到这样的东西工作,我有一个查询然后循环这些结果运行每年的额外查询,然后结合第二个查询的结果并吐出结果作为一张桌子。
答案 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']);
}