参考之前的question,我想知道它是否始终可以用 CASE 取代 DECODE ,哪个更适合性能?
答案 0 :(得分:51)
DECODE
和CASE
之间存在一个很大的区别,它与NULLs
的比较方式有关。如果您将DECODE
与NULL
进行比较,NULL
将返回“true”。 CASE
不会。例如:
DECODE(NULL, NULL, 1, 0)
将返回'1'。
CASE NULL
WHEN NULL THEN 1
ELSE 0
END
将返回“0”。你必须把它写成:
CASE
WHEN NULL IS NULL THEN 1
ELSE 0
END
答案 1 :(得分:44)
与Oracle一样...... AskTom ...
从此post ...
解码有点模糊 - CASE是 非常清楚。事情是 在解码中很容易做到 案例,难以或接近的事情 无法解码很容易 在案例中做。 CASE,逻辑明智,胜利 放下手。
从表现的角度来看,它们似乎差不多,上面的文章再次提到了一些速度差异,但没有对特定陈述进行基准测试,很难说。
答案 2 :(得分:3)
CASE是一个语句,DECODE是一个函数 我们可以在where子句中使用CASE,不能在where子句中使用DECODE。 DECODE只能在CASE可以支持所有关系运算符的情况下检查相等运算符 DECODE只能在sql中使用,因为CASE可以在SQL和PL / SQL中使用 CASE优于DECODE。
您可以找到更多:http://www.oraclegeneration.com/2014/01/sql-query-interview-questions.html
答案 3 :(得分:1)
从性能角度来看,在Oracle解码和CASE中没有任何区别。
但在Exadata中,Decode比CASE更快。
解码操作在存储服务器级别完成,其中存在数据但是CASE在数据库实例级别完成,该级别从数据库存储级别接收数据。
虽然存储和数据库服务器之间的数据网络传输较少(Infiniband连接),但使用解码状态时可以避免传输
答案 4 :(得分:1)
我知道这是一个老话题,但是CASE
和DECODE
之间还有另一个有趣的比较...选择你的毒药。
SELECT CASE 1 WHEN '1' THEN 'A' ELSE 2 END result
FROM DUAL
/*
ORA-00932: inconsistent datatypes: expected NUMBER got CHAR
00932. 00000 - "inconsistent datatypes: expected %s got %s"
*/
;
SELECT DECODE(1, '1', 'A', 2) result
FROM DUAL
/*
A
*/
;
答案 5 :(得分:0)
select (DECODE(NULL, NULL, 1, 0)) from dual;
select (CASE
WHEN NULL IS NULL THEN 1
ELSE 0
END
)
from dual;
都返回1
答案 6 :(得分:0)
NULL到NULL比较都将值返回为1,而不是DECODE返回值1,而CASE返回为0。