【问题标题】:Oracle: SELECT value from where clause as dummy tableOracle:从where子句中选择值作为虚拟表
【发布时间】:2018-07-18 09:41:46
【问题描述】:

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

我需要一个从 WHERE 子句返回值作为结果值的 Oracle-SQL 查询。这听起来很简单,但我就是不知道如何实现。

示例(应该如何):

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 中实现这一点? 提前感谢您的想法!

【问题讨论】:

  • 我认为你需要一个子查询
  • 你能举例说明你到底想做什么吗?
  • 我不能硬编码“MY_VALUE”,它只能在 WHERE 子句中提供(不能在 SELECT 或 FROM 部分或其他地方) 为什么不呢?此约束看起来完全是任意的,因此您最好进一步详细说明。
  • 我有一个从用户输入生成 SQL 查询的外部程序。这些用户输入仅在 where 子句的查询中可见。我需要提取提供的值以便能够进一步处理它们。
  • 如上所述是不可能的(我认为),所以请编辑您的问题以解释您所拥有的场景和限制,以及您可以影响什么。例如,您如何实际提供和运行查询,查询的复杂程度是否有限制,如何提供用户输入并将其馈送到查询中,您在每个阶段可以看到的确切内容等等。我可以 也许如果您正在使用(命名)绑定变量,但目前它太模糊了。

标签: sql oracle where-clause


【解决方案1】:

这是一个非常讨厌的 hack,更多的是出于好奇:

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 中有效,并且(到目前为止)总是报告正在搜索的值,但我不知道它是否得到保证。感觉像是在滥用时空连续体……

【讨论】:

  • @Ben - 是的...我只是稍微简化了它以避免使用listagg() 重建完整的 SQL 语句。如果不做更多研究,我不确定我是否会在生产代码中信任它 *8-)
【解决方案2】:
with t as 
(
select 'CHALKEG' as name from dual
)
select * from t where name = 'CHALKEG'

【讨论】:

  • 您可以通过解释为什么它解决了问题中提出的问题来改进此答案。
猜你喜欢
  • 2023-02-07
  • 1970-01-01
  • 2014-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-20
  • 1970-01-01
相关资源
最近更新 更多