Vad du än väljer, var medveten om att kortkod inte alltid är optimal kod. I många fall, där du har tillräckligt divergerande logik, är att förena resultaten verkligen det mest optimala (och ibland mest rena, programmässigt) alternativet.
Som sagt, följande OR i WHERE-satsen verkar täcka båda dina fall...
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")