【发布时间】:2021-06-08 17:19:02
【问题描述】:
我在 select 中有这个 case 语句:
CASE ('$5' = '')
WHEN NOT FALSE THEN TRUE
ELSE
ST_DWithin(latlong_g, ST_SetSRID(ST_Point($5::float, $6::float), 4326), $7, false) END
所以如果给prepare的参数是空的,case的计算结果为true(对于封闭和它在查询中使用的地方),否则应该执行else。
不幸的是,看起来 ELSE 是由 pg 解析器评估的,它被以下消息阻塞:
错误:双精度类型的输入语法无效:“”
有没有办法防止这个错误?
编辑:为清楚起见完整查询:
SELECT addritems.*,
St_y(adresse.latlong),
St_x(adresse.latlong)
FROM adresse
inner join addritems
ON addritems.adrcd = adresse.adrcd
AND addritems.plz LIKE Coalesce(Nullif($2, ''), addritems.plz)
AND CASE ( $3 = '' )
WHEN NOT FALSE THEN TRUE
ELSE St_dwithin(latlong_g,
St_setsrid(St_point($3::FLOAT, $4:: FLOAT), 4326),
$5, FALSE)
END
【问题讨论】:
-
您是在为
WHERE使用这个值,还是在SELECT中返回一个字段?什么是完整的查询?因为CASE不能 同时返回TRUE和ST_DWithin。所以也许你想要NULL作为第一个 -
我在
WHERE....AND CASE在查询 PostGIS 时调用 sql 库时使用它。参数 $5 可能设置为数值或空字符串,因此整个CASE应计算为TRUE以成为AND TRUE,或者,如果设置了参数,则调用ST_DWithin函数。但是,即使输入为 '',也会评估CASE ELSE部分 -
Edit1:对 ST_Point 的调用中的
'可能不会被使用。 -
我偶然发现了同样的问题 - ELSE 在不需要时进行评估。更简单的例子:db-fiddle.com/f/4jyoMCicNSZpjMt4jFYoz5/1737。有人可以澄清一下:这是否是 PG 错误?我检查了 PostgreSQL 10(小提琴)和 PG 11。
-
@JohnDoe 看到我更新的答案,我试图解释为什么会失败
标签: sql postgresql