PostgreSQL 批处理选择查询仍应返回行


postgresql batch select query should still return row

所以我的PHP应用程序中有很多SQL查询(可能超过1000个查询),每个查询都通过其ID和日期来区分,如下所示:

SELECT dataid, date_input, value FROM app_inputdata WHERE date_input='2013-03-10' AND dataid='2337'

查询显然需要很长时间才能完成,所以我正在尝试批处理它。 如何执行此操作,并且如果查询与任何行都不匹配,它仍应返回-作为value值的行。

您可以像这样构建单个查询:

SELECT dataid, date_input, value 
FROM app_inputdata 
WHERE 
    (date_input='2013-03-10' AND dataid='2337') 
    OR (date_input='...' AND dataid='..') 
    OR (...) -- and so on

获取不存在的行会使查询更加复杂。我建议在PHP端这样做。但是,如果您坚持,则可以通过以下方式获得不存在的行的-值:

SELECT data.date_input, data.dataid, COALESCE(app_inputdata.value, '-') as value
FROM (SELECT unnest(ARRAY[2337, 2338, ...]) as dataid, unnest(ARRAY['2013-03-10', '2013-03-11', ...]::date[]) as date_input) as data
LEFT JOIN app_inputdata ON app_inputdata.date_input = data.date_input AND app_inputdata.dataid = data.dataid

假设您有很多(例如数百或数千)date_inputdataid对,并且应该根据表检查它们app_inputdata,有效的方法是首先将这些对上传到临时表中,然后进行单选。

创建临时表的代码:

create table pg_temp.input_filter(date_input date, dataid int);

插入 date_input 和 dataID 对:

insert into pg_temp.input_filter values (?,?); 

,然后选择所需的数据:

select f.date_input, f.dataid,coalesce(d.value,'-') as value
from pg_temp.input_filter f
left join app_inputdata d on d.date_input=f.date_input and d.dataid=f.dataid;

我有同样的要求,我想也许我们可以使用函数,创建一个接受参数数组的sql函数,对于您的情况,也许有两种 - "date_input"和"dataid",在函数中,我们可以循环所有参数并将所有返回的结果保存在另一个数组中,我在我的项目中尝试过, 但尚未进行性能比较。

谢谢

约翰尼