Я бы сделал динамический запрос. То есть нужно проанализировать, какие селекты не пустые и добавить соответствующие условия в строку запроса в раздел where с оператором and динамически. Сам я не люблю динамические запросы, т.к. они в поддержке сложнее, но здесь - чем не вариант?