Postgresql Postgres中的动态FROM子句

Postgresql Postgres中的动态FROM子句,postgresql,postgresql-9.1,dynamic-sql,window-functions,Postgresql,Postgresql 9.1,Dynamic Sql,Window Functions,我使用PostgreSQL 9.1.13编写了以下查询来计算一些数据: 带窗的 选择一个.person\u id,一个.category\u id, 按类别划分的w上的等级为浮动/计数*100.0为百分位 从…起 选择不同的个人id、类别id* 从表演中 -要在此处插入FROM子句吗 s.person_id=p.ident上的内部连接人员p 按人员id、类别id、已创建描述排序 A. 窗口w按类别划分\u id按分数排序 从窗口中选择类别id,百分位 其中person_id=1; 现在我想把它变

我使用PostgreSQL 9.1.13编写了以下查询来计算一些数据:

带窗的 选择一个.person\u id,一个.category\u id, 按类别划分的w上的等级为浮动/计数*100.0为百分位 从…起 选择不同的个人id、类别id* 从表演中 -要在此处插入FROM子句吗 s.person_id=p.ident上的内部连接人员p 按人员id、类别id、已创建描述排序 A. 窗口w按类别划分\u id按分数排序 从窗口中选择类别id,百分位 其中person_id=1; 现在我想把它变成一个存储过程,但是我的问题是在中间,在那里我显示了注释,我需要放置一个动态的WHERE子句。例如,我想添加如下内容:

其中p.weight>110或p.weight为空 调用应用程序让人们选择过滤器,因此我希望能够将适当的过滤器传递到查询中。根据调用方的不同,可能有0个或多个筛选器,但我可以将其全部作为格式正确的where子句作为字符串参数传入,例如

调用应用程序只向Web服务发送值,然后Web服务生成字符串并调用存储过程,因此SQL注入攻击实际上不会成为问题

调用应用程序只是将值发送到Web服务,然后 生成字符串并调用存储过程,因此SQL注入 攻击不会成为真正的问题

厨师太多会使汤变质

要么让webserive构建SQL语句,要么让Postgres来构建。不要在同一个查询中同时使用这两个选项。这就为SQL注入攻击留下了两个可能的弱点,使得调试和维护变得更加困难

以下是plpgsql函数的完整代码示例,该函数动态生成和执行SQL语句,同时使SQL注入从两天前就不可能了:


详细信息在很大程度上取决于具体的要求。

您可以使用以SQL查询的形式执行任何字符串。如果您事先知道所有可能的筛选器,则可以使用参数而不是传入SQL字符串。有关一些示例,请参见此处:您显示的不是FROM子句,而是一组WHERE条件,无法转到您指定的位置。对于代码中的答案,需要精确说明可能的WHERE条件。