是否有使用可选参数创建搜索查询的一般模式?我在想我们应该能够构建一个多部分where
子句,但是取消了未指定的部分。此外,一些查询参数可能需要连接,如果未指定关联的查询参数,我想使它们无效。
示例(请参阅完整代码here)
想一个人员配置域。它包括项目,需求,人员和技能。我们希望根据以下标准搜索需求:
1. min_start_date
2. max_start_date
3. project_id
4. project_location
5. skill_id
以下是相关表格:
CREATE TABLE projects (
id SERIAL PRIMARY KEY,
name VARCHAR(64),
location VARCHAR(3) NOT NULL
);
CREATE TABLE needs (
id SERIAL PRIMARY KEY,
start_date TIMESTAMPTZ,
end_date TIMESTAMPTZ,
project_id INTEGER NOT NULL,
skill_id INTEGER NOT NULL
);
CREATE TABLE skills (
id SERIAL PRIMARY KEY,
name VARCHAR(64) NOT NULL
);
以下是搜索的查询:
\set min_start_date '2016-08-01T00:00:00-04'
\set max_start_date '2016-08-31T00:00:00-04'
\set project_id 71
\set project_location 'DEN'
\set skill_id 4
SELECT n.id, n.start_date, n.end_date
FROM needs n
LEFT OUTER JOIN projects p
ON n.project_id = p.id
WHERE n.start_date >= :'min_start_date'
AND n.start_date < :'max_start_date'
AND p.id = :'project_id'
AND p.location = :'project_location'
AND s.id = :'skill_id'
ORDER BY n.start_date, p.id, s.id;
我想要的是能否根据指定的查询参数使where子句的部分无效。如果未指定搜索参数project_location
,也不需要执行连接。
修改
基于Neil McGuigan的评论,我尝试了这个:
\set min_start_date 2016-08-01T00:00:00-04
SELECT *
FROM needs n
WHERE (:'min_start_date' IS NULL OR n.start_date >= :'min_start_date');
这可以正常工作并产生所需的结果,但是当我将min_start_date
的值更改为NULL时:
\set min_start_date NULL
我从PostgreSQL收到以下错误:
ERROR: invalid input syntax for type timestamp with time zone: "NULL"
LINE 8: WHERE ('NULL' IS NULL OR n.start_date >= 'NULL')
^
基本上我无法为OR的两侧提供正确的类型。不确定如何指定NULL参数值,并且SQL语句可以正常工作。
答案 0 :(得分:0)
是:
where
(column1Value is null OR column1 = column1Value)
and (column2Value is null OR column2 = column2Value)
...
连接条件是任何旧谓词,因此您可以根据需要使其变得复杂