У меня есть некоторый код, как это:динамический SQL в PLSQL
declare
p_vara varchar2;
p_varb varchar2;
p_varc varchar2;
begin
INSERT INTO MY_INSERTABLE_TABLE
SELECT a.id,b.id,c.id
FROM table_a a, table_b b, table_c c
WHERE a.id is not null
and a.id = b.id
and c.id = 'cat'
end;
Теперь на основе переменной, чтобы сделать его условным, так что только некоторые части запроса дозвонились на основе переменной.
declare
p_vara varchar2;
p_varb varchar2;
p_varc varchar2;
begin
INSERT INTO MY_INSERTABLE_TABLE
SELECT a.id, -- Show only if p_vara = 'yes'
b.id, -- Show only if p_varb = 'yes'
c.id -- Show only if p_varc = 'yes'
FROM table_a a, -- Use only if p_vara = 'yes'
table_b b, -- Use only if p_varb = 'yes'
table_c c -- Use only if p_varc = 'yes'
WHERE a.id is not null -- Use only if p_vara = 'yes'
and a.id = b.id -- Use only if p_vara = 'yes' and p_varb = 'yes'
and c.id = 'cat' -- Use only if p_varc = 'yes'
end;
Так, например, если переменные установлены, как это:
p_vara = 'yes'
p_varb = 'no'
p_varc = 'no'
Тогда запрос должен выглядеть следующим образом:
SELECT a.id
FROM table_a
WHERE a.id is null;
К сожалению, это всего лишь пример. Я изменил a.id: null, чтобы a.id не был нулевым. Должен работать сейчас. – user2924127
Это не фильтрация запроса. То, что вы ищете, - это динамический SQL, где сама заявка зависит от определенного определенного ввода. В качестве части динамического SQL вы должны указать динамический список столбца, который вы вставляете, если только ваш MY_INSERTABLE_TABLE имеет только один столбец, а 'p_vara',' p_varb' и 'p_varc' являются взаимоисключающими, что на основе вашей второй predicate 'и a.id = b.id - Использовать только в том случае, если p_vara = 'yes' и p_varb = 'yes'' неверно – Sentinel
У вас действительно есть только 3 переменные и в общей сложности 8 возможных комбинаций? В этот момент может быть проще просто ввести 8 отдельных статических операторов SQL. Например, ваш полный запрос объединяет 3 таблицы, но имеет только 1 условие соединения, поэтому он будет создавать декартово произведение. Если 'p_vara = 'yes' и p_varc = 'yes'', это создаст декартово произведение между' table_a' и 'table_c'. Маловероятно, что это было бы то, что вы хотите. –