sql - 将 "WHERE"参数传递给 PostgreSQL View?

标签 sql postgresql stored-procedures view

我在 PostgreSQL 数据库上有一个相当复杂的查询,该数据库通过一系列嵌套子查询跨越 4 个表。然而,尽管外观和设置看起来有点棘手,但最终它会根据两个外部参数的匹配(两个字符串需要与不同表中的字段匹配)返回两列(来自同一个表,如果这有助于这种情况)。我对 PostgreSQL 中的数据库设计还很陌生,所以我知道这个叫做 View 的看似神奇的东西是存在的,它似乎可以帮助我,但也许没有。

有什么方法可以将我的复杂查询移动到一个 View 中,并以某种方式将我需要匹配的两个值传递给它吗?这将大大简化我在前端的代码(通过将复杂性转移到数据库结构上)。我可以创建一个 View 来包装我的静态示例查询,它工作得很好,但是它只适用于一对字符串值。我需要能够将它与各种不同的值一起使用。

因此我的问题是:是否可以将参数传递给静态 View 并使其变为“动态” View ?或者也许 View 不是处理它的正确方法。如果还有其他更好的方法,我会洗耳恭听!

*编辑:* 根据评论中的要求,这是我现在的查询:

SELECT   param_label, param_graphics_label
  FROM   parameters
 WHERE   param_id IN 
         (SELECT param_id 
            FROM parameter_links
           WHERE region_id = 
                 (SELECT region_id
                    FROM regions
                   WHERE region_label = '%PARAMETER 1%' AND model_id =
                         (SELECT model_id FROM models WHERE model_label = '%PARAMETER 2%')
                 )
         ) AND active = 'TRUE'
ORDER BY param_graphics_label;

参数由上面的百分号分隔。

最佳答案

您可以使用集合返回函数:

create or replace function label_params(parm1 text, parm2 text)
  returns table (param_label text, param_graphics_label text)
as
$body$
  select ...
  WHERE region_label = $1 
     AND model_id = (SELECT model_id FROM models WHERE model_label = $2)
  ....
$body$
language sql;

然后你可以这样做:

select *
from label_params('foo', 'bar')

顺便说一句:你确定要:

AND model_id = (SELECT model_id FROM models WHERE model_label = $2)

如果 model_label 不是唯一的(或主键),那么这最终会引发错误。你可能想要:

AND model_id IN (SELECT model_id FROM models WHERE model_label = $2)

关于sql - 将 "WHERE"参数传递给 PostgreSQL View?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11401749/

相关文章:

sql - 我怎样才能在 Postgres 9.5 中做一些更新插入

sql - 在 postgres 中读取 XML 属性

sql-server - 我可以在 SQL Server 数据库中使用带有可能点的 varchar 类型的变量吗?

sql - 将每个用户的最新行转换为列

php - 使用具有多个 y 轴的 SQL Server 数据库绘制流程图

java - 使用 DynamicQuery 加入和分组

ruby-on-rails - Postgres sh :/usr/local/var/postgres/server. 日志:没有那个文件或目录

sql - 如何将列添加到查询中而不需要将它们放在分组依据中?

c# - 如何将下拉列表值作为存储过程的参数传递

php - 使用不带存储过程的 MySQL 是否会错过某些内容?