2010-07-07 11 views
28

Nawiązując do poprzedniego question, zastanawiałem się, czy jego zawsze można zastąpić dekodować przez CASE i co jest lepsze dla wydajności?CASE vs. dekodować

+5

po prostu google „przypadek Oracle vs dekodowanie” i znaleźć wiele linków. Zasadniczo Przypadek jest lepiej czytelny, bardziej elastyczny i bardziej standardowy. – Rene

Odpowiedz

42

Jak zawsze z Oracle ... AskTom ...

Od tego post ...

Decode jest nieco niejasne - CASE jest bardzo jasne. Rzeczy, które są łatwe do zrobienia w dekodowaniu są łatwe do zrobienia w CASE, rzeczy, które są trudne lub w pobliżu niemożliwe do zrobienia z dekodowania są łatwe zrobić w CASE. CASE, logicznie mądry, wygrywa .

Wydaje się, że z punktu widzenia wydajności są one takie same, ponownie powyżej artykułu wspomina niektóre różnice prędkości, ale bez analizy porównawczej poszczególnych stwierdzeń, które trudno powiedzieć.

+1

Kolejny punkt z tego samego artykułu: "dekodowanie jest funkcją, którą Oracle początkowo zapewniało wydanie bazy danych przed 8.1.6. Począwszy od 816, CASE to standardowy sposób na osiągnięcie te same wyniki " - Więc przy korzystaniu ze starszych wersji Oracle CASE może nie być dostępne. –

+1

8.1.6 jest bardzo stary, myślę, 8.1.6 daty z 1999. – TTT

+0

Dzięki @TTT, to interesujące. Właśnie zostałem zatrudniony do konwersji raportów Cognos 7 na Cognos 10 :). Teraz szukam przełączania instrukcji DECODE na CASE. –

42

Jest jedna wielka różnica między DECODE i CASE i że ma do czynienia z jak NULLs są porównywane. DECODE zwróci "true", jeśli porównasz NULL do NULL. CASE nie będzie. Na przykład:

powróci "1".

CASE NULL 
    WHEN NULL THEN 1 
    ELSE 0 
END 

spowoduje zwrócenie "0". Trzeba by napisać go jako:

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

Myślę, że jest to bardzo ważne rozróżnienie. Właśnie czytałem o dekoderze, próbując zastąpić go przypadkiem i zastanawiając się, dlaczego nie widzę takich samych rezultatów, gdy wartość kolumny ma zerową wartość. Dzięki za wyjaśnienie tego! – prabhu

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

select (CASE 
    WHEN NULL IS NULL THEN 1 
    ELSE 0 

END 
) 
from dual; 

zwracają 1

+0

nic tutaj, na co Cheran nie odpowiedział. – ceving

3

CASE jest stwierdzenie i dekodowania jest funkcją Możemy użyć CASE w klauzuli WHERE i nie mogą korzystać z Decode w klauzuli where. DECODE może sprawdzać operatory równości tylko wtedy, gdy CASE obsługuje wszystkie operatory relacyjne. DECODE można używać w sql tylko wtedy, gdy CASE może być użyte w SQL I PL/SQL CASE jest lepsze niż DECODE.

Można znaleźć więcej: http://www.oracleinformation.com/p/sql-tutorial.html

+2

-1 dla "... i nie może używać DECODE w klauzuli where."DECODE jest funkcją i każda funkcja ma wartość zwracaną, a możesz użyć tej wartości zwracanej, aby sprawdzić względem innej wartości: DECODE (tbl.field, SearchList, SomeConstOrAField, theDefault) NOT IN (inna lista) lub DECODE (tbl.field, SearchList, SomeConstOrAField, theDefault) = coś itd. –