Вы не используете никаких данных из user_location
, поэтому я бы порекомендовал:
SELECT ti.upc, ti.quantity, ti.return_type, ti.amount,
ti.transaction_date, ti.transaction_time, ti.location_id
FROM ransaction_item ti
WHERE (_user <> true OR
EXISTS (SELECT 1
FROM user_location ul
WHERE ul.location_id = ti.location_id AND
ul.user_id = _user_id AND
ul.location_id = _location_id
)
) AND
ti.transaction_date BETWEEN _start_date::date AND _end_date::date AND
ti.upc IS NOT NULL;
Мне кажется, что "условное соединение" трудно следовать. Однако условные фильтры в предложении WHERE
довольно просты для отслеживания.