簡體   English   中英

使用SQL函數而不是SELECT的優點

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM