首页 文章

Oracle:从where子句中将SELECT值作为伪表

提问于
浏览
0

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

我需要一个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中实现这一目标?提前感谢您的想法!

1 回答

  • 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中工作,并且(到目前为止)总是报告所搜索的值,但我不知道它是有保证的 . 感觉就像滥用时空连续统一体......

相关问题