2012-01-19 39 views
18

Tôi đang gặp sự cố khi cố tìm ra giải pháp gọn gàng nhất cho vấn đề sau.SQL - TRẢ LỜI TRƯỜNG HỢP - WHEN tuyên bố VÀ tuyên bố

Tôi có bảng Mua hàng có cột Nhà nước, theo đó 1 được ủy quyền, 2 được hoàn thành và cũng là một số mục khác.

Tôi cũng có bảng Bán lẻ có bảng RetailerProcessType, trong đó 1 là một bước và 2 là hai bước.

Bây giờ nhìn thấy các truy vấn dưới đây ...

CASE purc.State 
         WHEN 1 THEN '"AUTHORISED"' 
         WHEN 2 THEN '"AUTHORISED"' 
         WHEN 4 THEN '"AUTHORISED"' 
         ELSE '"DECLINED"' 
        END                 AS Autorised_Decline_Status, 

Những gì tôi cần làm là như sau:

KHI NHÀ NƯỚC = 2 VÀ RetailerProcessType = 1 THEN ' "ỦY QUYỀN"'

WHEN STATE = 1 AND RetailerProcessType = 2 THEN '"PENDING"'

WHEN STATE = 2 AND RetailerProcessType = 2 THEN '"AUTHORIZED"'

ELSE '"DECLINED"'

Cách duy nhất tôi có thể thấy là làm một câu lệnh IF lớn xung quanh truy vấn, một cho nhà bán lẻ một bước và một cho hai bước như sự hiểu biết của tôi một mệnh đề WHEN không thể có 'AND' trong nó.

Tuy nhiên, điều này dường như có vẻ ghê tởm và kéo dài, ai cũng có ý tưởng nào khác?

Steven

Trả lời

36

Bạn có thể làm theo cách này:

-- Notice how STATE got moved inside the condition: 
CASE WHEN STATE = 2 AND RetailerProcessType IN (1, 2) THEN '"AUTHORISED"' 
    WHEN STATE = 1 AND RetailerProcessType = 2 THEN '"PENDING"' 
    ELSE '"DECLINED"' 
END 

Lý do bạn có thể làm AND ở đây là bạn không kiểm tra trường hợp của nhà nước, nhưng thay vào đó bạn là điều kiện vỏ.

Phần quan trọng ở đây là điều kiện STATE là một phần của WHEN.

7

Chỉ cần thay đổi cú pháp của bạn bao giờ nên hơi:

CASE WHEN STATE = 2 AND RetailerProcessType = 1 THEN '"AUTHORISED"' 
    WHEN STATE = 1 AND RetailerProcessType = 2 THEN '"PENDING"' 
    WHEN STATE = 2 AND RetailerProcessType = 2 THEN '"AUTHORISED"' 
    ELSE '"DECLINED"' 
END 

Nếu bạn không đặt các biểu hiện trường trước khi báo cáo kết quả CASE, bạn có thể đặt khá nhiều bất kỳ lĩnh vực và so sánh trong đó mà bạn muốn. Đó là một phương pháp linh hoạt hơn nhưng có cú pháp dài hơn một chút.

-1
SELECT Get_Log.IDNo, Get_Log.StudentName, Get_Log.[Sign-in Date], Get_Log.DurationOfSum, Get_Log.Day, 
CASE WHEN DurationOfSum > 5 THEN '"present"' 
ELSE '"absent"' 
END AS Attendance 
FROM Get_Log; 
Các vấn đề liên quan