[英]Advantage of using a SQL function rather than a SELECT
在Postgresql 9.0數據庫中,我可以使用WHERE子句中的整數(profile_id)為帶有SELECT語句的網頁創建URL。
在過去,我只是在方便時完成SELECT,例如使用子查詢作為視圖中的列/字段。 但我最近意識到我可以創建一個SQL函數來做同樣的事情。 (這是一個SQL函數,而不是plpgsql)。
我想知道在這樣的情況下,在使用函數而不是SELECT時是否有優勢 (主要是在資源方面)? 見下文並提前感謝。 我在本網站的其他地方找不到關於此主題的任何內容。 (長期讀者,第一次來電)。
功能如下。
CREATE OR REPLACE FUNCTION msurl(integer)
RETURNS text AS
$BODY$
SELECT (('https://www.thenameofmywebsite/'::text ||
CASE
WHEN prof.type = 1 THEN 'm'::text
ELSE 'f'::text
END) || '/handler/'::text) || prof.profile_id AS profile_url
FROM profile prof
WHERE prof.profile_id = $1;
$BODY$
LANGUAGE sql
為了得到我的網址,我可以使用
SELECT prof.name,
SELECT (('https://www.thenameofmywebsite/'::text ||
CASE
WHEN prof.type = 1 THEN 'm'::text
ELSE 'f'::text
END) || '/handler/'::text) || prof.profile_id AS profile_url, prof.start_date
FROM profile prof,
WHERE prof.profile_id = id_number;
或更整潔的版本:
SELECT prof.name, msurl(id_number) as profile_url, prof.start_date FROM profile prof;
您使用該功能的方式沒有任何優勢 - 情況恰恰相反:它會大大減慢您的選擇。 因為對於從主select
語句(調用該函數的語句)檢索的每一行,您在同一個表上運行另一個 select。
當您想要封裝構建URL的邏輯時,函數確實有優勢。 但是你需要以不同的方式編寫函數,以便通過傳遞你想要使用的行來提高效率:
CREATE OR REPLACE FUNCTION msurl(profile)
RETURNS text AS
$BODY$
SELECT (('https://www.thenameofmywebsite/' ||
CASE
WHEN $1.type = 1 THEN 'm'
ELSE 'f'
END) || '/handler/' || $1.profile_id:: AS profile_url;
$BODY$
LANGUAGE sql;
另一種選擇是傳遞你需要的所有列,但是通過傳遞行(類型)函數簽名(因而調用它),如果邏輯發生變化並且你需要更多或更少的列,則不需要更改桌子。
然后,您可以使用以下語法調用它:
SELECT prof.name,
msurl( (prof) ) as profile_url,
prof.start_date
FROM profile prof;
請注意,將別名傳遞給函數時,必須將別名括在括號(prof)
。 附加括號在此處不是可選的。
這樣,仍然會為每一行調用該函數,但它不會在profile
表上運行另一個 select。
由於面向對象的方式Postgres處理這樣一個函數你甚至可以調用它,因為它是表的一列:
SELECT prof.name,
prof.msurl as profile_url,
prof.start_date
FROM profile prof;
函數感(sql函數)是封裝。 使用函數,SQL語句的某些片段具有名稱,語義 - 您可以重用它,您可以構建庫。 沒有任何其他好處,如性能 - 它只影響您的代碼可讀性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.