ORACLE:使用 CASE-WHEN-STATE 的结果
Posted
技术标签:
【中文标题】ORACLE:使用 CASE-WHEN-STATE 的结果【英文标题】:ORACLE: USE RESULT OF CASE-WHEN-STATEMENT 【发布时间】:2017-03-07 16:20:30 【问题描述】:我有一个很大的查询,我想知道它是否可以在 Oracle 中使用 获取 case-when-statement 的结果并将其用于比较?我的 CASE-STATEMENT 在 Select-Statement 中声明,看起来像这样。
SELECT........
(CASE
WHEN (Select 1 from DUAL) = 1 THEN 'TEST'
ELSE 'TEST2'
END) AS TEST;
现在我想得到这个 case-statement 的结果并在 where 部分使用它?是否可以? (对不起,这可能是一个愚蠢的问题)
【问题讨论】:
您在问题中提出的确切方式是不可能的。如果您在SELECT
子句中定义您标记(别名)为TEST
的表达式,则名称TEST
在同一SELECT
查询的WHERE
子句中不可见,因为处理了WHERE
在SELECT
之前。如果不想在WHERE
子句中重复相同的(可能很长)CASE
表达式,最好在子查询中定义TEST
,然后在WHERE
子句中选择并使用它外部查询。 (您可以使用WITH
子句来做到这一点。)对于未来的代码维护也更好。
【参考方案1】:
如果您在内联视图或公用表表达式(又名WITH
子句)中定义您的CASE
语句,您可以通过您给它的任何别名来引用它。
例如(内联视图):
SELECT ...
FROM ( SELECT .....
(CASE
WHEN (Select 1 from DUAL) = 1 THEN 'TEST'
ELSE 'TEST2'
END) AS TEST
FROM...
) v
WHERE v.test = 'TEST2';
作为一个通用的表表达式,应该是:
WITH cte AS ( SELECT........
(CASE
WHEN (Select 1 from DUAL) = 1 THEN 'TEST'
ELSE 'TEST2'
END) AS TEST
FROM ... )
SELECT ...
FROM cte
WHERE test = 'TEST2';
【讨论】:
【参考方案2】:您可以在where
子句中使用case
语句,例如:
select * from table
where table.field = (CASE
WHEN (Select 1 from DUAL) = 1 THEN 'TEST'
ELSE 'TEST2'
END)
这会将case
语句返回的值与表字段进行比较。
【讨论】:
以上是关于ORACLE:使用 CASE-WHEN-STATE 的结果的主要内容,如果未能解决你的问题,请参考以下文章