在我们的代码库中,我们在数据库中有许多发现,它们允许以基本上任何组合搜索可变数量的参数。其中大部分通常写成如下:
CREATE OR REPLACE FUNCTION getObject(p_field1 INTEGER, p_field2 INTEGER,
p_field3 INTEGER, p_field4 INTEGER, p_field5 INTEGER)
RETURNS SETOF Object
AS $_$
BEGIN
RETURN QUERY SELECT * FROM Table_ent_Object
WHERE (p_field1 = 0 OR Field1 = p_field1)
AND (p_field2 = 0 OR Field2 = p_field2)
AND (p_field3 = 0 OR Field3 = p_field3)
AND (p_field4 = 0 OR Field4 = p_field4)
AND (p_field5 = 0 OR Field5 = p_field5);
END;
$_$
LANGUAGE plpgsql;
一个懂 SQL 但不懂 PostgreSQL 的人指出,这在 SQL 中表现不佳,因为它不允许事先开发一个优化好的查询计划,但她不知道 PostgreSQL 是否会这样做。
这是构建这些查询的糟糕方法吗?如果是这样,有没有更好的方法?
需要注意的是,我们曾经对存储过程中的每个可能的参数组合进行硬编码,但这变得难以维护,因为在存储过程中添加、删除或更改参数影响很大,很容易错过一个参数组合需要更新,或者错误地订购参数检查并落入错误的情况。