Jedynym problemem jest to, że używasz OR zamiast AND.
Spójrzmy na przypadek, w którym wartość wynosi NULL:
CON.EMAILADDRESS IS NOT NULL
=> FAŁSZCON.EMAILADDRESS != ' '
=> BRAK
FAŁSZ LUB NULL => NULL. Ponieważ kryteria nie dają wartości TRUE, nie wybierasz wartości NULL.
A jeśli wartość jest pustym ciągiem '', '' ' lub jakakolwiek długość:
CON.EMAILADDRESS IS NOT NULL
=> PRAWDACON.EMAILADDRESS != ' '
=> FAŁSZ
PRAWDA LUB FAŁSZ => PRAWDA. Wybierasz pusty ciąg.
Przypuszczam, że to cię zdezorientowało:pomimo błędnego użycia OR zamiast AND, nadal usunąłeś niektóre puste ciągi, ale nie wszystkie.
A więc:
WHERE CON.EMAILADDRESS IS NOT NULL AND CON.EMAILADDRESS != ' ';
Lub, jak każdy ciąg != ''
nie może być NULL (NULL != ''
=> NULL, nie TRUE), po prostu:
WHERE CON.EMAILADDRESS != '';