Życie byłoby łatwiejsze, gdyby wszystkie twoje warunki zostały posortowane w porządku rosnącym.
Zakładam, że twoja rzeczywista aplikacja używa zmiennej, a nie zakodowanego na stałe ciągu. Rozwiązanie powinno więc wyglądać mniej więcej tak:
select city, postcode, name
from dealers
where name = p_search_term OR
postcode = p_search_term OR
city = p_search_term
ORDER BY case when postcode = p_search_term then p_search_term else 1 end desc
, case when name = p_search_term then p_search_term else city end asc