Как использовать колонку из запросa как фильтр в другом запросе?
В заголовке смысл вопроса возможно непонятен, попробую объяснить.
Скажем, есть таблица SOURCE_TABLE с одной колонкой, которая выглядит вот так:
Filter
------------------|
Name='John'
Surname = 'Smith'
Age = '25'
Хочу использовать эту таблицу как фильтр. Что-то вроде этого:
SELECT * FROM TARGET_TABLE WHERE (SELECT FILTER FROM SOURCE_TABLE)
Но честно говоря, не мог понять, как это сделать.
Знаете ли кто-то, как можно использовать колонку в качестве источника фильтров?
Пробовал с EXECUTE IMMEDIATE. Но есть проблема - это должно быть динамически по отношению к конечному результату, и хочется вывести результат запроса в конце.
DECLARE
my_filter VARCHAR2(100);
my_query VARCHAR2(500);
BEGIN
my_query := 'SELECT FILTER FROM SOURCE_TABLE WHERE ROWNUM=1';
EXECUTE IMMEDIATE my_query INTO my_filter;
EXECUTE IMMEDIATE 'SELECT * FROM TARGET_TABLE WHERE '||my_filter;
END;
Свободный перевод вопроса Can I use a query by itself as a filter in pl/sql? от участника @eoeroglu
Ответы (1 шт):
Допустим, есть эти двe таблицы с данными:
create table target_table (name varchar2 (16), surname varchar2(16));
insert all
into target_table values ('John', 'Doe')
into target_table values ('Ann', 'Smith')
into target_table values ('Steven', 'Feuerstein')
into target_table values ('Steven', 'King')
select * from dual
/
create table source_table (filter varchar2 (32))
/
insert all
into source_table values (q'[name='John']')
into source_table values (q'[name='Ann']')
into source_table values (q'[name='Steven' and surname='King']')
into source_table values (q'[surname='Feuerstein']')
select *from dual
/
Можно использовать функции XMLTABLE и DBMS_XMLGEN.GETXMLTYPE и получить желаемый результат динамически:
select t.*, s.filter
from source_table s, xmlTable (
upper ('/rowset/row')
passing dbms_xmlgen.getXMLtype (
'select * from target_table where '||s.filter)
columns
name varchar2 (16) path 'NAME',
surname varchar2 (16) path 'SURNAME') t
Результат:
NAME SURNAME FILTER
---------------- ---------------- --------------------------------
John Doe name='John'
Ann Smith name='Ann'
Steven King name='Steven' and surname='King'
Steven Feuerstein surname='Feuerstein'
Свободный перевод ответа от участника @Sayan Malakshinov