2013-03-13 34 views
5

Tôi đang làm việc với truy vấn có chứa câu lệnh "IF" trong mệnh đề "WHERE". Nhưng PL \ SQL Developer đang đưa ra một số lỗi trong khi thực hiện nó. Bất cứ ai có thể vui lòng giúp tôi với các truy vấn chính xác? Đây là truy vấn:Nếu tuyên bố trong Điều khoản ở đâu

SELECT t.first_name, 
     t.last_name, 
     t.employid, 
     t.status 
    FROM employeetable t 
WHERE IF status_flag = STATUS_ACTIVE then t.status = 'A' 
     IF status_flag = STATUS_INACTIVE then t.status = 'T' 
     IF source_flag = SOURCE_FUNCTION then t.business_unit = 'production' 
     IF source_flag = SOURCE_USER then t.business_unit = 'users' 
    AND t.first_name LIKE firstname 
    AND t.last_name LIKE lastname 
    AND t.employid LIKE employeeid; 

Tôi nhận được lỗi "ORA-00920: toán tử quan hệ không hợp lệ".

ngoặc Đặt xung quanh status_flag = STATUS_ACTIVE kết quả do lỗi "ORA-00907: ngoặc đúng mất tích"

Trả lời

9

TRƯỜNG HỢP có thể giúp bạn ra ngoài:

SELECT t.first_name, 
     t.last_name, 
     t.employid, 
     t.status 
    FROM employeetable t 
WHERE t.status = (CASE WHEN status_flag = STATUS_ACTIVE THEN 'A' 
         WHEN status_flag = STATUS_INACTIVE THEN 'T' 
         ELSE null END) 
    AND t.business_unit = (CASE WHEN source_flag = SOURCE_FUNCTION THEN 'production' 
           WHEN source_flag = SOURCE_USER THEN 'users' 
           ELSE null END) 
    AND t.first_name LIKE firstname 
    AND t.last_name LIKE lastname 
    AND t.employid LIKE employeeid; 

Các CASE statement đánh giá nhiều điều kiện để tạo ra một giá trị duy nhất. Vì vậy, trong lần sử dụng đầu tiên, tôi kiểm tra giá trị của status_flag, trả về 'A', 'T' hoặc null tùy thuộc vào giá trị của nó là gì và so sánh nó với t.status. Tôi làm tương tự cho cột business_unit với câu lệnh CASE thứ hai.

+0

cảm ơn! thực sự đã giúp – user2100620

+0

@DCookie, Làm cách nào tôi có thể thêm điều kiện mệnh đề WHERE bên trong câu lệnh IF? – masT

+0

Trường hợp: 't.status = null' sẽ không hoạt động đối với trường hợp t.status thực sự là rỗng. Null là lạ. – defactodeity

3

Bạn không thể sử dụng NẾU như thế. Bạn có thể làm những gì bạn muốn với AND và OR:

SELECT t.first_name, 
     t.last_name, 
     t.employid, 
     t.status 
    FROM employeetable t 
WHERE (status_flag = STATUS_ACTIVE AND t.status = 'A' 
    OR status_flag = STATUS_INACTIVE AND t.status = 'T' 
    OR source_flag = SOURCE_FUNCTION AND t.business_unit = 'production' 
    OR source_flag = SOURCE_USER  AND t.business_unit = 'users') 
    AND t.first_name LIKE firstname 
    AND t.last_name LIKE lastname 
    AND t.employid LIKE employeeid; 
+0

Thay vì sử dụng AND và OR, nếu tôi sử dụng CASE thì sao? 'Ở ĐÂU TRƯỜNG HỢP khi status_flag = STATUS_ACTIVE sau đó t.status = 'A' khi status_flag = STATUS_INACTIVE sau đó t.status = 'T' khi source_flag = SOURCE_FUNCTION sau đó t.business_unit = 'sản xuất' khi source_flag = SOURCE_USER sau đó t.business_unit = 'users' END VÀ t.first_name firstname NHƯ VÀ t.last_name NHƯ lastname VÀ t.employid NHƯ EmployeeID; ' tôi nhận được lỗi "ORA-00.905: thiếu từ khóa". Chính xác thì tôi đã làm gì sai trong trường hợp đó? – user2100620

+0

Xem câu trả lời của tôi. Bạn đang tiến gần hơn. – DCookie

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