问题描述
|
我有一个oracle查询,其中一部分是使用DECODE计算一些值。例如:
SELECT ...,(SELECT DECODE((SELECT 23 FROM DUAL),null,(SELECT 23 FROM DUAL))
FROM DUAL)
FROM ...
这里的值\“ 23 \”是在运行时计算的,它的联接非常复杂-多个表,使用PARTITION BY
等。因此,如果值不是\“ 0 \”,我想避免执行相同的子查询。有什么办法可以写这样的东西
SELECT ...,(SELECT DECODE ((SELECT 23 FROM DUAL) as test,test)
FROM DUAL)
FROM ...
解决方法
这对您有用吗?
我刚刚将\“ 23 \”移到了具有描述性别名的内联表中。
select ...,(
select
decode (
computed_value.val,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,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,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(短路评估)子句。