我有一个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 ...
答案 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(短路评估)子句。