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。稍後,我需要添加更多的這種類型的過濾器。
非常感謝伊戈爾。 – Ambran
雖然解決方案比'case'更爲簡單,但沒有什麼可以阻止它檢查左側。 –
@Clodoaldo沒有在完整的程序中測試,但['this'](http://sqlfiddle.com/#!12/5880c/3)示例顯示,查詢優化器可以省略無用的檢查。 –