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

有没有什么方法可以将复杂的查询移动到视图中,并以某种方式将需要匹配的两个值传递给它?这将大大简化我的前端代码(通过将复杂性转移到数据库 struct ).我可以创建一个视图来包装我的静态示例查询,它运行得很好,但是它只适用于一对字符串值.我需要能够将它用于各种不同的价值观.

因此,我的问题是:是否有可能将参数传递到一个静态视图中,并使其成为"动态"视图?或者,一种观点不是正确的方法.如果还有其他更好的办法,我洗耳恭听!

*Edit: *根据 comments 中的要求,以下是我目前的问题:

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相关问答推荐

识别顺序记录组

创建每小时重置的序列号

如何重用表值用户定义函数调用的结果?

SUM(条件)在Oracle?

如何在SQL Server中列出从当前月份开始的过go 10年中的月份

Django将字符串筛选为整数?

计算周时出现SQL错误结果

删除事务中的本地临时表

PostgreSQL 9.6嵌套的INSERT/RETURN语句的CTE性能低得令人无法接受

除了风格之外,还有什么理由更喜欢简单的CASE WHEN而不是搜索呢?

如何在Hive SQL中分别按多列进行分组?

复制SQL Server临时表

达到特定值时,从0开始累加求和

Postgres数据库维护:基于GROUP BY删除旧记录

使用ALTER TABLE无法删除列

基于 Snowflake 的最大值创建新列

PostgreSQL - 递归地聚合来自不同列的属性

条件前置值

snowfalke 会在 Select 运行时锁定表吗?

在 Microsoft SQL Server 中,如何只为特定值保留不同的行?