CASE () в основном переводчик: он возвращает значение для заданного набора условий. Проблема в том, что вы пытаетесь заставить его вернуть значение BOOLEAN. Это не будет работать, потому что BOOLEAN не является допустимым типом данных SQL.
Так что я думаю, вам придется реализовать свою логику в виде вложенных предложений И / ИЛИ. Это немного грубовато, но не намного сложнее, чем ваше первоначальное утверждение. Примерно так:
WHERE p.id = m.id
AND (
( c.match_text IS NOT NULL
AND ( lower(p.station) LIKE '%'||c.match_text||'%'
OR ( lower(p.station) LIKE '%sealed in%'
AND lower(p.affected_units) LIKE '%'||c.match_text||'%'
)
)
)
OR (u.name LIKE '%Memory%'
AND lower(p.affected_fuels) LIKE '%nuclear%'
AND ...