Каквото и да изберете, имайте предвид, че краткият код не винаги е оптимален код. В много случаи, когато имате достатъчно различна логика, обединяването на резултатите наистина е най-оптималната (а понякога и най-чистата, програмно) опция.
Въпреки това, следното ИЛИ в клаузата WHERE изглежда покрива и двата ви случая...
SELECT DISTINCT
shops.*,
DA.delivery_cost,
DA.postcode AS AreaPostcode
FROM
shops
INNER JOIN
shops_delivery_area as DA
ON (DA.shop_id = shops.id)
WHERE
(DA.postcode = "Liverpool")
OR
(DA.postcode = shops.postcode AND shops.location = "Liverpool")