案例与解码

时间:2010-07-07 09:57:48

标签: sql oracle

参考之前的question,我想知道它是否始终可以用 CASE 取代 DECODE ,哪个更适合性能?

7 个答案:

答案 0 :(得分:51)

DECODECASE之间存在一个很大的区别,它与NULLs的比较方式有关。如果您将DECODENULL进行比较,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)

我知道这是一个老话题,但是CASEDECODE之间还有另一个有趣的比较...选择你的毒药。

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。