oracle:解码和子查询选择结果

时间:2011-06-01 04:04:52

标签: sql oracle subquery decode

我有一个oracle查询,其中一部分是使用DECODE计算一些值。例如:

SELECT ..., 
      (SELECT DECODE((SELECT 23 FROM DUAL), 
                      0, null,
                     (SELECT 23 FROM DUAL))  
         FROM DUAL) 
  FROM ...

这里值“23”在运行时计算,并且它是非常复杂的连接 - 多个表,使用PARTITION BY等。所以我想避免在值不是“0”时执行相同的子查询。有没有办法写这样的东西

SELECT ..., 
       (SELECT DECODE ((SELECT 23 FROM DUAL) as test, 
                        0, null,
                       test)  
         FROM DUAL) 
  FROM ...

5 个答案:

答案 0 :(得分:9)

这对你有用吗? 我刚刚将“23”移动到带有描述性别名的内联表中。

select ..., 
  (
   select 
     decode ( 
            computed_value.val, 
            0, null,
            computed_value.val
            )  
   from
     (select 23 as val from dual) computed_value
  )
from
  ...

CASE声明也可能增加清晰度,如:

select
  ...
 ,case when computed_value.val = 0
       then null
       else computed_value.val
       end as my_field
from
  (select 23 as val from dual) computed_value
  ...

答案 1 :(得分:1)

或者:

WITH q AS (
SELECT 23 test, 16 test2 FROM dual
)
SELECT ... 
     , DECODE(q.test, 0, NULL, q.test) value
     , CASE WHEN q.test2 = 0 THEN NULL 
            WHEN q.test2 = 16 THEN 1
            ELSE q.test2
       END another_value
  FROM q, ...

允许您在主选中使用查询“q”,只允许使用子查询。称为WITH子句,或公用表表达式或子查询因子。请在Oracle-Base.com了解详情。

答案 2 :(得分:1)

对于此特定情况,您可以使用NULLIF功能:

SELECT ..., 
      (SELECT NULLIF((SELECT 23 FROM DUAL), 0)  
         FROM DUAL) 
  FROM ...

如果两个参数相等,则NULLIF函数返回NULL,否则返回第一个参数。

答案 3 :(得分:0)

您可以在from子句中使用子查询,并执行以下操作:

select conf_key, decode(test, 0, null, test) from (
select conf_key, (select conf_value from config_values where conf_key = 'DOMAINID') as TEST from config_values )

答案 4 :(得分:0)

最好你会使用CASE语句。因为CASE语句就像一系列IF语句,只使用关键字WHEN。 CASE语句从上到下进行评估。如果条件为真,则执行相应的THEN子句并执行跳转到END CASE(短路评估)子句。