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

| 我有一个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 ...
    
已邀请:
        这对您有用吗? 我刚刚将\“ 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
  ...
    
        要么:
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上了解有关它的更多信息。     
        对于这种特殊情况,可以使用
NULLIF
函数:
SELECT ..., 
      (SELECT NULLIF((SELECT 23 FROM DUAL), 0)  
         FROM DUAL) 
  FROM ...
如果两个参数相等,
NULLIF
函数将返回returns9ѭ,否则它将返回第一个参数。     
        您可以在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 )
    
        最好您使用CASE语句。由于CASE语句就像一系列IF语句,因此仅使用关键字WHEN。 CASE语句从上到下进行评估。如果条件为真,则执行相应的THEN子句,然后执行跳转到END CASE(短路评估)子句。     

要回复问题请先登录注册