我们需要一个函数来根据邻域名称或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地理文本传递),并按照演示了here和here的方法有效地忽略了哪个参数为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一样吗?