Apa pun yang Anda pilih, ketahuilah bahwa kode pendek tidak selalu merupakan kode yang optimal. Dalam banyak kasus, di mana Anda memiliki logika yang cukup berbeda, menyatukan hasil benar-benar merupakan opsi yang paling optimal (dan terkadang paling bersih, secara terprogram).
Yang mengatakan, berikut ATAU dalam klausa WHERE tampaknya mencakup kedua kasus Anda...
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")