What is the LOV you are using the for the Select List?
The select lists uses a display value and a separate return value - which would be used in the where clause of your query.
So if your select list was
select staff_name, staff_id from my_staff
then you would be comparing ID to staff name, hence no results.
Have you considered Scott Wesley's answer? Make sure both the display and return value of your select list LOV query is the STAFF_NAME column.
That's perfectly fine in this situation. You need the name of the staff as the return value of your select list. That's why both the return and display column are identical.
Ideally your search page's SQL would use
select ........ from .......... where staff_id = nvl(:p29_staff_id,staff_name)
and your LOV would be as I previously mentioned.
This is because it's likely there would/should be an indext on staff_id - but we don't know your structure.
The only difference between the NVL and DECODE in this case is readability.
Really you should forget both of these and get in the habit of using COALESCE and CASE.