Oracle:将where子句中的SELECT值用作伪表

时间:2018-07-18 09:41:46

标签: sql oracle where-clause

经过大量搜索,很遗憾,我找不到以下任务的解决方案:

我需要一个Oracle-SQL-Query,它从WHERE子句中返回该值作为结果值。这听起来很简单,但我只是找不到解决方法。

示例(应如何显示):

SELECT some_dummy_colum FROM some_dummy_table WHERE some_dummy_coumn = 'MY_VALUE';

所需结果:

MY_VALUE

我知道我可以写类似的东西

SELECT 'MY_VALUE' FROM DUAL;

但是在这种情况下,我无法对'MY_VALUE'进行硬编码,只能在WHERE子句中提供(不能在SELECT或FROM部件或其他地方)。

在Oracle中有什么方法可以实现这一目标? 预先感谢您的想法!

2 个答案:

答案 0 :(得分:1)

这真是一个令人讨厌的骇客,更多是出于好奇:

select (
  select regexp_replace(vsql.sql_text,
    q'@.*where '(.*)' is not null@', '\1')
  from v$session vses
  join v$sql vsql
  on vsql.sql_id = vses.sql_id
  where vses.audsid = userenv('SESSIONID') 
) as result
from dual
where 'MY_VALUE' is not null
/

RESULT              
--------------------
MY_VALUE 

或者没有子查询,如果可以使where子句更复杂:

select regexp_replace(vsql.sql_text,
  q'@.*and '(.*)' is not null@', '\1') as result
from v$session vses
join v$sql vsql
on vsql.sql_id = vses.sql_id
where vses.audsid = userenv('SESSIONID') 
and 'MY_VALUE2' is not null
/

RESULT              
--------------------
MY_VALUE2 

无论哪种方式,它都会在数据字典中查找此会话当前正在执行的语句;我不完全确定这是正确的做法。这似乎在11g和12c中有效,并且(到目前为止)始终报告正在搜索的值,但我不知道它是否可以保证。感觉就像在滥用时空连续体...

答案 1 :(得分:0)

with t as 
(
select 'CHALKEG' as name from dual
)
select * from t where name = 'CHALKEG'