2013-01-15 33 views
0

我想知道如何使用函數參數conditionaly。這是我的功能,並且可以讀取查詢裏面的評論:PostgreSQL有條件使用函數參數

CREATE OR REPLACE FUNCTION mediabase.select_media(sysEnvironment character varying, statusId integer) 
RETURNS refcursor AS 
$BODY$ 
DECLARE 
    ref refcursor; 
BEGIN 
    OPEN ref FOR 

    SELECT media.id, media.title, media.unique_filename, media.owner_id, media.status_id, media.location_name_id, media.upload_user_id, media.upload_ip, media.metadata_id, media.type_id, media.description, media.system_environment, media.upload_date, media.gps_location, media.language_id, media_publications.publication_id, media.limitations, media_categories.category_id, metadata.width, metadata.height, metadata.equipment, metadata.copyright, metadata.creation_time, metadata.file_format, metadata.resolution, metadata.resolution_unit, metadata.gps_longitude, metadata.gps_latitude, metadata.artist, metadata.color_space, metadata.gps_altitude, metadata.software_used, metadata.user_comment 
    FROM mediabase.media, mediabase.metadata, mediabase.media_categories, mediabase.media_publications 
    WHERE media.metadata_id = metadata.id 
    AND media.id = media_categories.media_id 
    AND media.id = media_publications.media_id 
    -- Problem: this CASE doesn't work of course 
    CASE statusId <> -1 THEN 
    AND media.status_Id = statusId 
    END 
    -- End problem 
    AND media.system_environment = sysEnvironment 
    ORDER BY media.upload_date DESC; 

    RETURN ref;      
END; 
$BODY$ 
LANGUAGE plpgsql VOLATILE 
COST 100; 

我只需要使用「statusId」參數,如果它是從-1不同,否則我獲贈沒有結果的有 - 課程不是地位-1。稍後,我需要添加更多的這種類型的過濾器。

回答

1

嘗試類似:

AND (media.status_Id = statusId OR statusId = -1) 

它不會如果statusId = -1檢查media.status_Id = statusId

+0

非常感謝伊戈爾。 – Ambran

+0

雖然解決方案比'case'更爲簡單,但沒有什麼可以阻止它檢查左側。 –

+0

@Clodoaldo沒有在完整的程序中測試,但['this'](http://sqlfiddle.com/#!12/5880c/3)示例顯示,查詢優化器可以省略無用的檢查。 –