2012-01-25 45 views
1

我在想,如果这样的事情可能是可能的:数据库设计:选择查询在功能参数

SELECT * FROM table1 
WHERE a1 = ... AND a2 = ... AND b1 = ... AND b2 = ... 

然而,什么是真正发生在这里的是,我调用数据库的功能,如:

func1(a1,a2); 

它返回一个类型:

(b1,b2) 

所以,这个想法是从最终用户的角度来看,这感觉就像我们正常查询表一样,然而,函数调用和结果查询选择对用户是隐藏的,并且在后台完成。

任何帮助,以建议在数据库中可能的设计,可以实现这一点,将不胜感激。 (例如,table1可能是某种虚拟表或视图)。

+0

您需要指定数据库平台。 – RedFilter

+0

我正在使用PostgreSQL。 – Larry

回答

0

不知道你的数据库平台,我只能推测。

在SQL Server中,您编写了一个Table Valued Function(TVF)。

PostgreSQL看起来也是support

您将在函数本身内评估a1b1。外部选择只涉及WHERE条款中的b1b2

+0

PostgreSQL如何,这正是我使用的? – Larry

+0

它看起来像你可以从PostgreSQL中的函数返回一个表值:http://www.postgresql.org/docs/9.0/static/sql-createfunction.html – RedFilter

+0

你能否延长你的答案或许提供一个例子如何解决这个问题,使用我指定的场景,thnx。 – Larry

0

大多数数据库中的存储过程可以返回一组行。

为此,PostgreSQL中的存储函数可以为return a cursor(请参见“返回游标”部分)。

+0

谢谢,但您能否进一步解释如何使用它,或者使用原始问题给出一个小例子。 – Larry

+0

@Larry您提到“由此产生的查询选择对用户是隐藏的,并在幕后完成”。所以,你可以隐藏一个函数返回一个游标(或RETURNS TABLE为RedFilter建议)... –

+0

我希望我没有误导的问题,但我想要的是,我仍然想用户可以通过WHERE子句指定参数名称和值,但是这会被适当地解析(即,有些可能是函数调用,有些可能用于查询选择,这就是我所说的“幕后”)。 。但是,请您确认一下,是否仍有可能允许用户使用WHERE子句进行params? (如果是这样,那正是我所需要的,我会更深入地看待所提出的建议)。感谢名单! – Larry

1

我无法找到提供确切查询的方法。

我最近管理的只是调用from子句中的函数。语法不同,并且您正在函数调用中指定函数参数,而不是where子句。

如:

CREATE OR REPLACE FUNCTION myfun(a1 INT, a2 INT) 
RETURNS TABLE (b1 int, b2 int) 
AS 
$$ 
BEGIN 
    RETURN QUERY (SELECT a1+a2 AS b1, a1*a2 AS b2); 
END; 
$$ 
LANGUAGE plpgsql; 

,它可以让我们称之为

select * from myfun(4,5); 

b1 b2 
---- ---- 
9 20 

我看看PostgreSQL的Rule系统可能能够从where子句重写查询和移动参数进入函数调用,但我找不到方法。