我在表中有一个列存储了sql-where子句:
Table_A
ID | entry
--------------
1 | "(select some_id FROM table_one)" -- This is stored a VARCHAR(4000)
2 | "(select some_id FROM table_one WHERE column_one like 'test')"
是否可以在entry列中将where语句用作select?
中的where类似的东西:
SELECT *
FROM table_B, table_A
WHERE table_B.id = table_A.id
AND table_B.value IN --and here should be the entry column from table_A
答案 0 :(得分:3)
您无法在SQL中动态添加SQL。
或者您可以使用在函数中封装查询逻辑并使用{{3}}
为此你需要创建一个函数(下面的SQL中的my_function),它返回一个字符串集合并接受一个SQL语句作为参数并以这种方式编写你的查询
SELECT *
FROM table_B, table_A
WHERE table_B.id = table_A.id
AND table_B.value IN (select column_value from Table(MY_FUNCTION(Table_A.SQL_Statement))
使用此方法不应忽略性能。我建议你在使用这个解决方案之前评估上下文切换的结果
此外,您还必须分析是否有可能 SQL Injection ,并确保没有恶意SQL作为参数传递给函数
示例代码
CREATE TYPE varchar_tab_t AS TABLE OF VARCHAR2(30);
/
CREATE OR REPLACE function MY_FUNCTION (sqlstring in varchar2) return varchar_tab_t IS
v_values_tab varchar_tab_t;
BEGIN
EXECUTE IMMEDIATE sqlstring bulk collect into v_values_tab;
return v_values_tab;
END MY_FUNCTION;
/
with table_a (id, SQL_STATEMENT) as
(select 1, 'Select 1 from dual union select 2 from dual union select 3 from dual' from dual)
, table_b (id, value) as
( select 1, 1 from dual
union all select 1, 2 from dual
union all select 1, 5 from dual -- this one should not be shown
)
SELECT *
FROM table_B, table_A
WHERE table_B.id = table_A.id
AND table_B.value IN (select column_value from Table(MY_FUNCTION(Table_A.SQL_Statement)))
<强>结果强>
1 1 1 Select 1 from dual union select 2 from dual union select 3 from dual
1 2 1 Select 1 from dual union select 2 from dual union select 3 from dual