2010-07-07 27 views
28

Đề cập đến một trước question, tôi đã tự hỏi nếu nó luôn luôn có thể thay thế GIẢI MÃ bởi TRƯỜNG HỢP và cái nào là tốt hơn cho hiệu suất?TRƯỜNG HỢP vs GIẢI MÃ

+5

Tôi vừa googled "Oracle case vs decode" và tìm thấy nhiều liên kết. Về cơ bản Case dễ đọc hơn, linh hoạt hơn và tiêu chuẩn hơn – Rene

Trả lời

42

Như thường lệ với Oracle ... AskTom ...

Từ post này ...

Giải mã có phần che khuất - CASE là rất rất rõ ràng. Những điều cần làm là dễ dàng để làm trong giải mã rất dễ làm trong TRƯỜNG HỢP, những thứ khó hoặc gần không thể làm với giải mã rất dễ dàng để làm trong CASE. CASE, logic khôn ngoan, thắng tay xuống.

Từ quan điểm về hiệu suất có vẻ như chúng giống nhau, một lần nữa ở trên đề cập đến một số khác biệt về tốc độ nhưng không cần đánh giá các câu nói cụ thể khó nói.

+1

Một điểm khác từ cùng một bài viết: "Giải mã là hàm Oracle ban đầu được cung cấp với các bản phát hành của cơ sở dữ liệu trước 8.1.6. Bắt đầu với 816, CASE là cách tiêu chuẩn để đạt được cùng một kết quả " - Vì vậy, khi sử dụng các phiên bản cũ hơn của Oracle, CASE có thể không khả dụng. –

+1

8.1.6 là rất cũ, tôi nghĩ rằng 8.1.6 ngày từ năm 1999. – TTT

+0

Cảm ơn @TTT, đó là thú vị. Tôi vừa được thuê để chuyển đổi các báo cáo Cognos 7 thành Cognos 10 :). Bây giờ hãy xem xét chuyển đổi câu lệnh DECODE thành CASE. –

42

Có một sự khác biệt lớn giữa DECODECASE và nó phải làm với cách so sánh NULLs. DECODE sẽ trả về "true" nếu bạn so sánh NULL đến NULL. CASE sẽ không. Ví dụ:

DECODE(NULL, NULL, 1, 0) 

sẽ trả về '1'.

CASE NULL 
    WHEN NULL THEN 1 
    ELSE 0 
END 

sẽ trả về '0'. Bạn sẽ phải viết nó như:

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

Tôi nghĩ đây là một sự khác biệt rất quan trọng. Tôi đã chỉ đọc về giải mã, cố gắng để thay thế nó bằng trường hợp và tự hỏi tại sao tôi không nhìn thấy kết quả tương tự khi một giá trị cột có null. Cảm ơn bạn đã làm rõ điều này! – prabhu

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

select (CASE 
    WHEN NULL IS NULL THEN 1 
    ELSE 0 

END 
) 
from dual; 

cả hai trở lại 1

+0

không có gì ở đây mà chưa được trả lời bởi Cheran. – ceving

3

CASE là một tuyên bố và giải mã là một chức năng Chúng tôi có thể sử dụng CASE trong mệnh đề where và không thể sử dụng DECODE trong mệnh đề where. DECODE chỉ có thể kiểm tra các toán tử bình đẳng khi CASE có thể hỗ trợ tất cả các toán tử quan hệ DECODE chỉ có thể được sử dụng trong sql khi CASE có thể được sử dụng trong SQL và PL/SQL CASE tốt hơn DECODE.

Bạn có thể tìm thêm: http://www.oracleinformation.com/p/sql-tutorial.html

+2

-1 cho "... và không thể sử dụng DECODE trong mệnh đề where."DECODE là một hàm và mọi hàm đều có giá trị trả về. Và bạn có thể sử dụng giá trị trả về đó để kiểm tra một số giá trị khác: DECODE (tbl.field, SearchList, SomeConstOrAField, theDefault) NOT IN (một số danh sách khác) hoặc DECODE (tbl.field, SearchList, SomeConstOrAField, theDefault) = một cái gì đó v.v. –

Các vấn đề liên quan