如何使用可选的搜索参数在SQL中创建搜索查询?

时间:2016-05-30 18:51:27

标签: sql postgresql

是否有使用可选参数创建搜索查询的一般模式?我在想我们应该能够构建一个多部分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语句可以正常工作。

1 个答案:

答案 0 :(得分:0)

是:

where
   (column1Value is null OR column1 = column1Value)
   and (column2Value is null OR column2 = column2Value)
   ...

连接条件是任何旧谓词,因此您可以根据需要使其变得复杂