Это довольно старая идея, но мало кто может сразу с ходу предположить, что условие LIKE можно использовать в перевернутом состоянии.
Рассмотрим простую задачу. Требуется выбрать все строки таблицы, значение одного из полей которой, попадает в список произвольных значений перечисленных через запятую. Возьмём, к примеру, таблицу jobs из демонстрационной схемы HR. Надо вывести из неё информацию о конкретных должностях: президента, вице-президента, финансовых и маркетинговых менеджеров. Выводить будем по первичному ключу. В результате у нас образуется список из следующий значений: AD_PRES, AD_VP, FI_MGR, MK_MAN. Попробуем вывести строки, которые попадают в этот список.
Первое что быстро приходит в голову, это использовать конструкцию IN:
SQL> SELECT * FROM hr.jobs WHERE job_id IN ('AD_PRES', 'AD_VP', 'FI_MGR','MK_MAN') JOB_ID JOB_TITLE MIN_SALARY MAX_SALARY ------- ----------------------------- ---------- ---------- AD_PRES President 20000 40000 AD_VP Administration Vice President 15000 30000 FI_MGR Finance Manager 8200 16000 MK_MAN Marketing Manager 9000 15000
К сожалению здесь нельзя использовать переменные связывания. Да и список значений придётся изменить, обрамляя каждое значение апострофами.
А что если использовать LIKE, но не в обычном его применении. Как известно LIKE используют для поиска значения или его части в соответствии с текстовым образцом. Слева от LIKE обычно указывается столбец, в котором производится поиск, а справа образец поиска. Список значений в качестве образца поиска, конечно, выступать не может, но почему бы не использовать в качестве образца само значение столбца.
И так, указываем слева от LIKE список искомых значений, а справа название столбца, обрамлённое знаками процента. Теперь, при выполнении запроса, для каждой строки, в списке значений будет осуществляться поиск текстового образца, т.е. значения столбца. Благодаря символам процента выведутся только те строки, значение столбца которых будет найдено в списке:
SQL> SELECT * FROM hr.jobs WHERE 'AD_PRES,AD_VP,FI_MGR,MK_MAN' LIKE '%' || job_id || '%' JOB_ID JOB_TITLE MIN_SALARY MAX_SALARY ------- ----------------------------- ---------- ---------- AD_PRES President 20000 40000 AD_VP Administration Vice President 15000 30000 FI_MGR Finance Manager 8200 16000 MK_MAN Marketing Manager 9000 15000
И главное, для строки списка значений теперь можно использовать переменную связывания:
SQL> VAR 1 VARCHAR2 SQL> VAR 1="AD_PRES,AD_VP,FI_MGR,MK_MAN" SQL> SELECT * FROM hr.jobs WHERE :1 LIKE '%' || job_id || '%' JOB_ID JOB_TITLE MIN_SALARY MAX_SALARY ------- ----------------------------- ---------- ---------- AD_PRES President 20000 40000 AD_VP Administration Vice President 15000 30000 FI_MGR Finance Manager 8200 16000 MK_MAN Marketing Manager 9000 15000