Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 组合可选参数和子查询_Sql_Postgresql_Subquery_Postgis_Parameterized Query - Fatal编程技术网

Sql 组合可选参数和子查询

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

我正在编写一个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 $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
。不,仍然返回零行。