2013-01-15 35 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)示例显示,查询优化器可以省略无用的检查。 –