Печать

Это довольно старая идея, но мало кто может сразу с ходу предположить, что условие 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