postgresql批量选择查询应该仍然返回行

时间:2016-03-16 05:32:33

标签: php postgresql

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

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

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

3 个答案:

答案 0 :(得分:0)

您可以构建如下的单个查询:

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

答案 1 :(得分:0)

假设您有很多(比如数百或数千)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;

答案 2 :(得分:0)

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

谢谢,

约翰尼