How to get desired result set?
You can use an inner join between customers and orders where the via has the wanted values and a NOT EXISTS to check, that no unwanted via exists.

SELECT c1.*
       FROM customers c1
            INNER JOIN orders o1
                       ON o1.customer_id = c1.customer_id
       WHERE o1.via IN ('WEB', '')
             AND NOT EXISTS (SELECT *
                                    FROM orders o2
                                    WHERE o2.customer_id = c1.customer_id
                                          AND o2.via = 'POS');


(If the empty via is actually a NULL not an empty string, change o1.via IN ('WEB', '') to coalesce(o1.via, '') IN ('WEB', '') or to o1.via = 'WEB' OR o1.via IS NULL.)

Alternatively you can do it just with EXISTS and NOT EXISTS. 

SELECT c1.*
       FROM customers c1
       WHERE EXISTS (SELECT *
                            FROM orders o1
                            WHERE o1.customer_id = c1.customer_id
                                  AND o1.via IN ('WEB', ''))
       AND NOT EXISTS (SELECT *
                              FROM orders o2
                              WHERE o2.customer_id = c1.customer_id
                                    AND o2.via = 'POS');


(Again, if the empty via is actually a NULL not an empty string, change o1.via IN ('WEB', '') to coalesce(o1.via, '') IN ('WEB', '') or to o1.via = 'WEB' OR o1.via IS NULL.)
Again you can use a join and NOT EXISTS.

SELECT c1.*
       FROM customers c1
            INNER JOIN orders o1
                       ON o1.customer_id = c1.customer_id
       WHERE o1.via = 'APP'
             AND NOT EXISTS (SELECT *
                                    FROM orders o2
                                    WHERE o2.customer_id = c1.customer_id
                                          AND o2.via &lt;&gt; 'APP');


Or just use EXISTS/NOT EXISTS.

SELECT c1.*
       FROM customers c1
       WHERE EXISTS (SELECT *
                            FROM orders o1
                            WHERE o1.customer_id = c1.customer_id
                                  AND o1.via = 'APP')
       AND NOT EXISTS (SELECT *
                              FROM orders o2
                              WHERE o2.customer_id = c1.customer_id
                                    AND o2.via &lt;&gt; 'APP');