我使用PostgreSQL10,我想构建具有多个可选参数的查询。
用户必须输入区域名称,但是可以选择不选择以下任何组合或事件,事件日期,类别,类别日期,风格的任意组合
所以完整的查询可以是“所有银行(类别),建于1990年(类别日期),具有现代建筑(风格),于1992年(事件和事件日期)在纽约(地区)地区进行了翻新”
我的问题是所有这些都在不同的表中,由多对多表连接,所以我不能做像
这样的事情SELECT * FROM mytable
WHERE (Event IS NULL OR Event = event)
如果我加入四张桌子,我不知道是否会有任何好处。 我可以轻松找到区域ID,因为它是必需的,但除此之外我不知道用户选择了什么。
有关如何使用Postgre进行此操作的任何建议吗?
答案 0 :(得分:1)
动态构建整个查询可能最优,只能加入您知道为了应用用户过滤器而需要的表,但这是不切实际的。你最好在整个表格上创建一个视图。使用LEFT OUTER JOIN
确保您不会意外过滤出有效的组合并为表编制索引,以确保查询计划程序可以快速导航表格图。然后使用WHERE
子句查询视图,该子句仅反映您要应用的过滤器。
如果性能成为一个问题,并且您不介意拥有非实时数据,则可以使用materialized view来缓存结果。物化视图可以直接编入索引,但这是一个非常彻底的改变,所以除非必须这样做,否则不要这样做。