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 子句中不可见,因为处理了WHERESELECT 之前。如果不想在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 的结果的主要内容,如果未能解决你的问题,请参考以下文章

oracle的数据怎么发送到接口

Oracle游标使用总结

oracle使用工具

如何使用oracle的DBMS

oracle日期转换函数怎么调优

自己安装了oracle怎么使用