Oracle:SELECT 来自 where 子句的值作为虚拟 table
Oracle: SELECT value from where clause as dummy table
经过大量搜索,不幸的是我找不到解决以下任务的方法:
我需要一个 Oracle-SQL-查询,returns 来自 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 中有什么方法可以做到这一点吗?
提前感谢您的想法!
这是一个非常讨厌的 hack,更多的是出于好奇:
select (
select regexp_replace(vsql.sql_text,
q'@.*where '(.*)' is not null@', '')
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@', '') 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 中有效,并且(到目前为止)总是报告正在搜索的值,但我不知道它是否有保证。感觉像是在滥用 space-时间连续体...
with t as
(
select 'CHALKEG' as name from dual
)
select * from t where name = 'CHALKEG'
经过大量搜索,不幸的是我找不到解决以下任务的方法:
我需要一个 Oracle-SQL-查询,returns 来自 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 中有什么方法可以做到这一点吗? 提前感谢您的想法!
这是一个非常讨厌的 hack,更多的是出于好奇:
select (
select regexp_replace(vsql.sql_text,
q'@.*where '(.*)' is not null@', '')
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@', '') 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 中有效,并且(到目前为止)总是报告正在搜索的值,但我不知道它是否有保证。感觉像是在滥用 space-时间连续体...
with t as
(
select 'CHALKEG' as name from dual
)
select * from t where name = 'CHALKEG'