ads 728x90 B

(ORA-00017) - CASE & DECODE?

CASE vs DECODE ?

Case và Decode trong Oracle cung cấp một cấu trúc có điều kiện, cụ thể:
if A = n1 then A1
elsif A = n2 then A2
else B

Decode làm được những gì thì Case cũng sẽ làm được. Tuy nhiên không có sự ngược lại ở đây: những gì Case làm được chưa chắc Decode làm được.

Một số khác biệt giữa Case và Decode:
  • Case là statement, Decode là function
  • Case dùng được nhiều toán tử logic hơn Decode
  • Decode chỉ thực hiện so sánh bằng, Case làm được nhiều hơn như: <, >, BETWEEN, LIKE,...
SQL> SELECT (CASE WHEN 1 = 1 THEN 'True'
                  WHEN 1 > 1 THEN 'Fasle'
                  ELSE 'N/A'
             END) 

             RESULT
     FROM DUAL;


RESULT
------
True


1 row selected.
SQL> SELECT DECODE (1,1,'True','Fasle') RESULT FROM DUAL;

RESULT
------
True


1 row selected.
  • Case có thể dùng với toán tử IN và subquery
SELECT CASE
            -- predicate with "IN"
            WHEN SALARY IN (9000,10000) THEN '9K-10K'
            -- searchable subquery
            WHEN EMP_NO IN (SELECT MGR_NO FROM DEPARTMENT) THEN 'Dept_Mgr'
            ELSE 'Unknown'
       END CATEGORY
FROM EMPLOYEE;
  • Case có thể dùng được trong khối lệnh PL/SQL, trong khi Decode chỉ dùng được trong câu truy vấn SQL.
  • Decode như một function trong SQL. Case là sự thay thế hiệu quả cho IF-THEN-ELSE trong PL/SQL. Trong ví dụ sau, nếu bạn thay thế CASE bằng DECODE thì sẽ gây nên lỗi:
DECLARE
    v_SERVICE_ID        NUMBER(1);
    v_SERVICE_NAME      VARCHAR2(20 CHAR);
BEGIN
    v_SERVICE_ID := 3;   
    v_SERVICE_NAME := CASE WHEN v_SERVICE_ID = 1 THEN 'Google Ads'
                           WHEN v_SERVICE_ID = 2 THEN 'Facebook Ads'
                           WHEN v_SERVICE_ID = 3 THEN 'ADX'
                           ELSE 'Coc Coc Ads'
                      END;   
    DBMS_OUTPUT.PUT_LINE('Service name = ' || v_SERVICE_NAME);                    
END;


-------------------
Service name = ADX
DECLARE
    v_SERVICE_ID        NUMBER(1);
    v_SERVICE_NAME      VARCHAR2(20 CHAR);
BEGIN
    v_SERVICE_ID := 3; 
    v_SERVICE_NAME := DECODE(v_SERVICE_ID,1,'Google Ads',2,'Facebook Ads',3,'ADX','Coc Coc Ads'); 
    DBMS_OUTPUT.PUT_LINE('Service name = ' || v_SERVICE_NAME);                   
END;


-------------------
Error at line 1
ORA-06550: line 6, column 23:
PLS-00204: function or pseudo-column 'DECODE' may be used inside a SQL statement only
ORA-06550: line 6, column 5:
PL/SQL: Statement ignored
  • Case có thể được sử dụng như một tham số (parameter) trong Function/Procedure, trong khi Decode thì không
EXEC MyProc(CASE :A WHEN 'THREE' THEN 3 ELSE 0 END);
Câu thực thi phía trên không có vấn đề gì, tuy nhiên nếu dùng Decode như bên dưới sẽ bị lỗi:
EXEC MyProc(DECODE(:A,'THREE',3,0));
  • Trong Case, các giá trị dùng để so sánh cần phải có chung datatype, đối với Decode thì không ràng buộc điều này
SELECT CASE 200 WHEN 100 THEN 100
                WHEN '200' THEN '200'
                ELSE '300'
       END TEST_CASE
FROM DUAL;
--------                    
Error at line 2
ORA-00932: inconsistent datatypes: expected NUMBER got CHAR
SQL> SELECT DECODE(200,100,100,'200','200','300') TEST_DECODE FROM DUAL;

TEST_DECODE
-----------
        200
1 row selected.
  • Case xử lý đối với NULL có sự khác nhau
Decode:
SQL> SELECT DECODE(NULL,NULL,'This is Null','This is not Null') TEST_DECODE FROM DUAL;

TEST_DECODE
-----------
This is Null
1 row selected.
Case:
SQL> SELECT CASE WHEN NULL IS NULL THEN 'This is Null'
            ELSE 'This is not Null'
       END TEST_CASE
FROM DUAL;


TEST_CASE
-----------
This is Null
1 row selected.
SQL> SELECT CASE NULL WHEN NULL THEN 'This is Null'
                      ELSE 'This is not Null'
       END TEST_CASE
FROM DUAL;


TEST_CASE
-----------
This is not Null
1 row selected.

Kết: Dựa trên những sự so sánh bên trên, bạn có thể xác định được nên chọn Case hay Decode để phục vụ tốt nhất cho mục đích của mình.
(ORA-00017) - CASE & DECODE? (ORA-00017) - CASE & DECODE? Reviewed by Uit Lân on 12/07/2018 01:57:00 SA Rating: 5

Không có nhận xét nào:

ads 728x90 B
Được tạo bởi Blogger.