经过大量搜索,很遗憾,我找不到以下任务的解决方案:
我需要一个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中有什么方法可以实现这一目标? 预先感谢您的想法!
答案 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'