2010-07-07 22 views
28

Refiriéndose a una anterior question, me preguntaba si su siempre posible sustituir DECODE por CASO y cuál es mejor para el rendimiento?CASO vs DECODE

+5

acabo en Google "caso Oracle vs decodificación" y encontré un montón de enlaces. Básicamente Case es mejor legible, más flexible y más estándar – Rene

Respuesta

42

Como siempre con Oracle ... ... AskTom

De esta post ...

Decode es un tanto oscuro - CASE es muy muy claro. Las cosas que son fáciles de hacer en la decodificación son fáciles de hacer en CASO, las cosas que son difíciles o cerca de imposible de hacer con la decodificación son fáciles de hacer en CASO. CASE, lógicamente sabio, gana incuestionablemente.

Desde el punto de vista del rendimiento parece que están a punto de la misma, de nuevo por encima artículo menciona algunas diferencias de velocidad pero sin evaluación comparativa de los estados particulares que es difícil de decir.

+1

Otro punto del mismo artículo: "decodificar es la función que Oracle proporcionó originalmente con versiones de la base de datos anteriores a 8.1.6. Comenzando con 816, CASE es la forma estándar de lograr los mismos resultados " - Entonces cuando se usan versiones anteriores de Oracle, CASE puede no estar disponible. –

+1

8.1.6 es muy antiguo, creo que 8.1.6 data de 1999. – TTT

+0

Gracias @TTT, eso es interesante. Me contrataron para convertir informes de Cognos 7 a Cognos 10 :). Ahora buscamos cambiar las declaraciones DECODE a CASE. –

42

Hay una gran diferencia entre DECODE y CASE y tiene que ver con la comparación de NULLs. DECODE devolverá "verdadero" si compara NULL con NULL. CASE no lo hará. Por ejemplo:

DECODE(NULL, NULL, 1, 0) 

devolverá '1'.

CASE NULL 
    WHEN NULL THEN 1 
    ELSE 0 
END 

devolverá '0'. Usted tendría que escribir como:

CASE 
    WHEN NULL IS NULL THEN 1 
    ELSE 0 
END 
+0

Creo que esta es una distinción muy importante. Estaba leyendo sobre decodificación, tratando de reemplazarlo con mayúsculas y preguntándome por qué no estoy viendo los mismos resultados cuando el valor de una columna tenía valores nulos. Gracias por aclarar esto! – prabhu

0
select (DECODE(NULL, NULL, 1, 0)) from dual; 

select (CASE 
    WHEN NULL IS NULL THEN 1 
    ELSE 0 

END 
) 
from dual; 

ambos devuelven 1

+0

nada aquí que no haya sido respondido por Cherán. – ceving

3

CASE es una declaración y decodificar es una función Podemos usar el bolso en la cláusula where y no podemos usar el DECODE en la cláusula where DECODE puede verificar operadores de igualdad solo cuando CASE puede admitir todos los operadores relacionales DECODE se puede usar en sql solo donde como CASE se puede usar en SQL Y PL/SQL CASE es mejor que DECODE.

Puede encontrar más: http://www.oracleinformation.com/p/sql-tutorial.html

+2

-1 para "... y no puede usar el DECODE en la cláusula where."DECODE es una función y cada función tiene un valor de retorno y se puede usar ese valor de retorno para comprobar contra algún otro valor:. DECODE (tbl.field, SearchList, SomeConstOrAField, theDefault) NO EN (alguna otra lista) o DECODE (tbl.field, SearchList, SomeConstOrAField, theDefault) = algo etc. –