2012-01-25 49 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子句重寫查詢和移動參數進入函數調用,但我找不到方法。