Sql 组合可选参数和子查询
我正在编写一个web服务端点,它允许您从PostgreSQL数据库获取Sql 组合可选参数和子查询,sql,postgresql,subquery,postgis,parameterized-query,Sql,Postgresql,Subquery,Postgis,Parameterized Query,我正在编写一个web服务端点,它允许您从PostgreSQL数据库获取offices。如果在请求中指定了ID参数,则只应返回给定地区(与该ID匹配)中的办事处;否则,应检索所有办公室 下面是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
offices
。如果在请求中指定了ID参数,则只应返回给定地区
(与该ID匹配)中的办事处;否则,应检索所有办公室
下面是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参数,如果请求中未提供,则默认为空字符串。是一个PostGIS功能
当$1
不是空字符串时,查询工作正常。但当它为空时,不会提取任何办公室(由于某种原因,当r
子查询不返回任何行时,所有内容都会崩溃
我做错了什么
如果$1
是一个空字符串(即,如果您愿意,将其设置为“可选子查询”),如果我可以忽略r
子查询,那就太好了。尝试以下操作:
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)
我不明白。NULLIF($1,”)是如何实现的=''
work?当$1未设置时,它将为NULL或“”。然后此条件将为true。否则它将检查id=$1::INT。稍微更改了答案。但是为什么=''
?它永远不会为true,因为NULL
将返回NULL
。不,仍然返回零行。