2013-08-27 61 views
1

我想在Postgres 8.2中編寫一個函數,它將分析我們用於報告目的的數據集中的4個特定列,然後返回用特定文本對記錄進行分類的文本。在Postgresql中編寫函數8.2

在我們以前的報表環境中,我會利用報表工具(Crystal Reports)來計算這一點,但我收到的指令是它應該作爲數據庫中的函數完成。

這裏是什麼,我試圖做的(請原諒的錯誤,我仍然在學習的基礎知識)

CREATE FUNCTION fnc_Breakdown(character varying, character varying, character varying, character varying) 
RETURNS character varying AS $$ 
DECLARE 
breakdown character varying; 
BEGIN 
IF $1 in ('ABCD') THEN breakdown:= "CSS" 
ELSE 
IF $1 like ('DCA%) AND $2 IN ('District 123','District 124') and $3 IN (' 
THEN breakdown:= "FAB" 
ELSE breakdown:= "OTHERS" 
END IF; 
RETURN breakdown; 
END; 

$$ LANGUAGE plpgsql IMMUTABLE; 
+1

什麼問題? – glenatron

+4

除了沒有真正告訴我們你的問題是什麼,你沒有包括有效的語法(它看起來像是在''DCA%''後面忘記了一個結束撇號,'$ 3 IN(''似乎缺少一些代碼)。修復並重新提交至少需要編譯的源代碼。還要注意,您使用的PostgreSQL版本自2011年以來一直不受支持:http://www.postgresql.org/support/versioning/您應該儘快安排升級。 – kgrittn

回答

0

您的功能需要一定的格式和分號的例子,但在總體上是好的。我也建議一些友好的格式,rememeber,你寫代碼的人不是計算機:

create or replace function fnc_Breakdown 
(
    character varying, 
    character varying, 
    character varying, 
    character varying 
) 
returns character varying as $$ 
declare 
    breakdown character varying; 
begin 
    if $1 = 'ABCD' then 
    breakdown := 'CSS'; 
    elseif $1 like 'DCA%' and $2 in ('District 123','District 124') then 
    breakdown:= 'FAB'; 
    else 
    breakdown:= 'OTHERS'; 
    end if; 
    return breakdown; 
end; 
$$ language plpgsql immutable; 

其實這樣一個簡單的任務,可以不帶功能人工做的,只是表達的情況下:

case 
    when a = 'ABCD' then 
     'CSS' 
    when a like 'DCA%' and b in ('District 123','District 124') then 
     'FAB' 
    else 
     'OTHERS' 
end 

看到sql fiddle demo擺弄查詢