As I said, I am posting my simpler version of piclrow's answer. I tested this on my Firebird, which is version 2.5, but OP (Steve) tested it on 2.1, and it also works.
SELECT id FROM table WHERE label IN ('Apple', 'Pear', 'Peach') GROUP BY id HAVING COUNT(DISTINCT label)=3
This solution has the same drawback as picrov ... you need to know how many values you are looking for, since the HAVING = condition must match the WHERE IN condition. In this regard, Ed's answer is more flexible as it breaks the string parameter of the combined value and counts the values. Thus, you just need to change one parameter, instead of the two conditions that I and pikkru use.
OTOH, if efficiency is a concern, I would prefer (but I'm absolutely not sure) that the Ed CTE approach may be less optimized using the Firebird mechanism than the one I suggest. Firebird is very good at optimizing queries, but I'm really not right now, if possible, when you use CTE in this way. But WHERE + GROUP BY + HAVING should be optimized by simply specifying the index (id, label).
In conclusion, if the execution time is troubling in your case, you will probably need some explanation to see what happens, whatever decision you make;)
Frazz source share