SSIS Lookup Component Irregularities
I've seen this behavior as well. Mine was due to server memory, which I'll explain in the guidelines. This was pesky because it was intermittent.

With partial cache, the cache starts off empty then queries until it finds a match. If you have multiple matches, the first one wins. With full cache, if you have multiple matches, I'm not sure which would win. Probably the first in the cache order. 

Partial cache has an option for miss cache, which will remember which records don't have matches and won't query them again. This will be a problem if you are inserting into the table that you are doing a lookup on. Also with full cache, if your source contains duplicates, the second won't get a match after the first is inserted which will be a problem if you want to suppress all but the first. 

Here are a few guidelines that I try to follow when using lookups:


The lookup will never swap cache to disk. If it runs out of memory, the task will fail. If this is your issue, get more ram or try partial.
Use integers whenever possible. If the field is string but can be cast to int, do it. This remove case and white space issues all together
Trim strings. White space will give you fits.
If it is a string, upper case both sides before comparing (lookups are case sensitive and will fail if the cases don't match).
Null never equals Null. If the column is nullable, replace both sides with "UNKNOWN" if string and a irrational number like -999 if it is integer.
If the column is empty, replace both sides with the text "EMPTY"


These are a pain in the butt, but it's better than getting a call at 3am because a tier 1 customers ETL failed.