So how did the bad data (with the ?) get in there in the first place???
But anyway, couldn't you use LIKE?
FROM table AS t1, table AS t2
WHERE t1.field LIKE REPLACE( t2.field, '?', '_' )
You replace the ? with underline, which is the one-character wildcard used by LIKE and then compare them using LIKE instead of just =