Wat je ook kiest, houd er rekening mee dat korte code niet altijd optimale code is. In veel gevallen, waar je voldoende uiteenlopende logica hebt, is het samenvoegen van de resultaten echt de meest optimale (en soms meest zuivere, programmatische) optie.
Dat gezegd hebbende, de volgende OR in de WHERE-clausule lijkt beide gevallen te dekken...
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")