2013-01-23 2 views
1

Я расширяю свой выбор из media элементов с фильтрами, среди которых один из них - category. Связь между медиа и категорией - это много-ко многим, что означает, что у меня есть таблица отношений media_categories. Я отправляю фильтр категорий в виде integer[] с идентификаторами категории. Как сопоставить два массива, чтобы получить общие элементы?Список совместимых с PostgreSQL идентификаторов

Вот моя хранимая процедура: (см комментарий в коде)

CREATE OR REPLACE FUNCTION mediabase.select_media(sysenvironment character varying, statusid integer, wildcard character varying, categoryIds 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, 
     (SELECT ARRAY (SELECT publication_id FROM mediabase.media_publications WHERE media_id = media.id)) as publication_ids, 
     media.limitations, 
     (SELECT ARRAY (SELECT category_id FROM mediabase.media_categories WHERE media_id = media.id)) as category_ids, 
     (SELECT ARRAY (SELECT keyword_id FROM mediabase.media_keywords WHERE media_id = media.id)) as keyword_ids, 
     media.credits, 
     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 
    WHERE media.metadata_id = metadata.id 
    AND (media.status_Id = statusId OR statusId = -1) 
    AND media.system_environment = sysEnvironment 
    AND (lower(media.title) LIKE lower('%'||lower(wildcard)||'%') OR lower(media.description) LIKE lower('%'||lower(wildcard)||'%') OR lower(metadata.artist) LIKE lower('%'||lower(wildcard)||'%')) 
    -- Problem start 
    -- in the following line I'm trying to make the match with no success 
    AND (SELECT ARRAY (SELECT category_id FROM mediabase.media_categories WHERE media_id = media.id)) IN (categoryIds) 
    -- Problem end 
    ORDER BY media.upload_date DESC; 

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

Благодаря

ответ

1

Hm, я предполагаю, что вы ищете функции Postgre массива < @ (содержится по)

http://www.postgresql.org/docs/9.2/static/functions-array.html

Условие должно выглядеть примерно так:

AND (SELECT ARRAY (SELECT category_id FROM mediabase.media_categories WHERE media_id = media.id)) <@ categoryIds 
+0

Спасибо. Последнее, что я использую строку 'SELECT ARRAY (SELECT category_id FROM mediabase.media_categories WHERE media_id = media.id)' дважды. Можете ли вы показать мне, как сохранить его в переменной 'Integer []', которую я могу повторно использовать в запросе? – Ambran

+0

Попробуйте: DECLARE category_ids integer []; ... SELECT ARRAY (SELECT category_id FROM mediabase.media_categories WHERE media_id = media.id) INTO category_ids; –

Смежные вопросы