组合可选参数和子查询

时间:2015-03-26 08:34:06

标签: sql postgresql subquery postgis parameterized-query

我正在编写一个Web服务端点,可以从PostgreSQL数据库中获取offices。如果在请求中指定了ID参数,则只应返回给定region(与该ID匹配)的办公室;否则,应该检索所有 offices

以下是SQL查询:

SELECT o.location
FROM (SELECT location FROM offices) AS o,
     (SELECT polygon FROM regions WHERE id = NULLIF($1, '')::int) AS r
WHERE (CASE WHEN $1 = '' THEN TRUE ELSE ST_Contains(r.polygon, o.location) END)

$1是可选的ID参数,如果请求中未提供,则默认为空字符串。 ST_Contains是PostGIS功能。

$1不是空字符串时,查询正常工作。但是当 为空时,不会获取offices。 :(由于某种原因,当r子查询没有返回任何行时,一切都会崩溃。

我做错了什么?

如果r是一个空字符串,那么我可以简单地忽略$1子查询(例如,如果你愿意,可以将它作为“可选的子查询”)。

1 个答案:

答案 0 :(得分:0)

试试这个:

SELECT o.location
FROM (SELECT location FROM offices) AS o,
     (SELECT polygon FROM regions WHERE COALESCE(TRIM($1), '') = '' OR id = NULLIF($1,'')::INT) AS r
WHERE (CASE WHEN COALESCE(TRIM($1),'') = '' THEN TRUE ELSE ST_Contains(r.polygon, o.location) END)