Ať už si vyberete cokoli, uvědomte si, že krátký kód není vždy optimální kód. V mnoha případech, kdy máte dostatečně divergentní logiku, je sjednocení výsledků skutečně nejoptimálnější (a někdy nejčistší, programově) možností.
Zdá se, že následující OR v klauzuli WHERE pokrývá oba vaše případy...
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")