不同的WHERE子句取决于Postgres函数参数

时间:2018-12-31 21:03:15

标签: postgresql

我们需要一个函数来根据邻域名称或PostGIS几何过滤器检索一组属性。

邻域匹配要快得多,因此我们尽可能使用地理过滤器作为后备。

仅在邻域上匹配的原始函数非常快:

func_a:

CREATE OR REPLACE FUNCTION func_a( _neighborhood text )
RETURNS TABLE(f1 int) AS $$
SELECT id FROM parcels
WHERE neighborhood = _neighborhood
ORDER BY id
LIMIT 10 $$
LANGUAGE SQL;

然后,我添加了替代的地理参数(作为WKT地理文本传递),并按照演示了herehere的方法有效地忽略了哪个参数为NULL:

func_b:

CREATE OR REPLACE FUNCTION func_b( _neighborhood text = NULL
                                    , _geo       text = NULL)
RETURNS TABLE(f1 int) AS $$
SELECT id FROM parcels
WHERE (_neighborhood IS NULL OR neighborhood = _neighborhood)
AND (_geo IS NULL OR ST_Intersects(geometry, ST_GeomFromText(_geo, 3857)))
ORDER BY id
LIMIT 10 $$
LANGUAGE SQL;

尽管func_b起作用了,但即使仅通过了_neighborhood参数,它也比func_a慢得多。实际上,无论是否通过了_neighborhood或_geo参数,func_b都同样缓慢,这对我来说没有意义。如果使用有效的_neighborhood参数和NULL _geo参数调用func_b,它的功能应该与func_a一样吗?

0 个答案:

没有答案