0

関数パラメーターを条件付きで使用する方法を知りたいです。これは私の関数であり、クエリ内のコメントを読むことができます:

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 がないため、結果を受け取りません。後で、そのようなフィルターをいくつか追加する必要があります。

4

1 に答える 1

1

次のようなものを試してください:

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

かどうかはチェックしmedia.status_Id = statusIdませんstatusId = -1

于 2013-01-15T12:29:05.023 に答える