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

han*_*ant 7 sql oracle decode subquery

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

SELECT ..., 
      (SELECT DECODE((SELECT 23 FROM DUAL), 
                      0, null,
                     (SELECT 23 FROM DUAL))  
         FROM DUAL) 
  FROM ...
Run Code Online (Sandbox Code Playgroud)

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

SELECT ..., 
       (SELECT DECODE ((SELECT 23 FROM DUAL) as test, 
                        0, null,
                       test)  
         FROM DUAL) 
  FROM ...
Run Code Online (Sandbox Code Playgroud)

Jos*_*ons 10

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

select ..., 
  (
   select 
     decode ( 
            computed_value.val, 
            0, null,
            computed_value.val
            )  
   from
     (select 23 as val from dual) computed_value
  )
from
  ...
Run Code Online (Sandbox Code Playgroud)

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
  ...
Run Code Online (Sandbox Code Playgroud)