Answer
Build the condition to specifically recognize a sentinel value (like !%) as meaning 'match NULL', on top of the existing blank-means-all and specific-value-means-filtered behavior — for example: ('$Project$' IS NULL OR project_id LIKE '$Project$' OR ('$Project$' = '!%' AND project_id IS NULL)). This gives three distinct behaviors from the same parameter: leaving it blank still shows everything, entering a real value filters to that value, and entering the sentinel !% specifically shows only records where project_id itself is NULL — something a plain LIKE comparison alone can't express, since LIKE has no way to match NULL directly.