Леш, этот метод автоматом исключает использование индексов с участием данного поля, что сильно сужает область применения. Хочется более универсальный метод.
Я решил это чисто программно: используя свой формат имен подстановки и прогон с заменой перед prepare(). Только такой метод тоже сокращает универсальность, т.к. для данного поля теряется гибкость prepared statement и вообще это вызывает побочные явления.
Например, в Oracle, при различных значениях подставляемого списка, это будут разные операторы с собственным планом выполнения (Oracle кеширует планы выполнения в системных таблицах, чем существенно ускоряет быстрые запросы).
В MySQL есть свои prepared statements и, у меня есть подозрение, в более современных API (для версий >= 4.1) это может скрыто использоваться.
В одном из API PHP — в PDO — есть тип подстановки PDO::PARAM_STM — параметр-курсор. Но, пока ни один драйвер это не поддерживает.
В Oracle я бы решил это через PIPE-функцию и превращением в IN в поздапрос:
IN (SELECT * FROM TABLE(my_function(:STRING)))В MySQL так не получится - там нет ни массивов, ни возврата курсоров, ни PIPE-функций. Есть возможность вернуть рекордсет (и не один) из процедуры, но для в подзапросов это использовать нет возможности.
В других СУБД опять же будут свои методы. Или не будут. А хочется универсальности.