2011-08-19 110 views
4

嗨我想寫多個case語句來預設作業的優先級。這裏有幾個表和ID,但基本上我想檢查該作業是否存在,如果它的確如果與此相關的questionid是80,然後有多個case state,那麼如果作業minor類別是1,那麼答案將是High的ID。我已經這樣做的遠可以更好地解釋代碼...sql多個案例聲明

ALTER Procedure [dbo].[usp_CreatePresetPriority] 
    @HelpdeskID int, 
    @MinorCategoryID int 
As 
BEGIN 

IF EXISTS(SELECT * FROM TicketInformation WHERE TicketID = @HelpdeskID AND QuestionID = 80) 
    BEGIN 
     UPDATE TicketInformation 
     SET AnswerInput = Null, 
      AnswerID = CASE @MinorCategoryID WHEN 87 THEN 129 END 
     WHERE TicketID = @HelpdeskID And QuestionID = 80 

    END 

ELSE 
    BEGIN 
     INSERT INTO TicketInformation (TicketID, QuestionID, AnswerID, AnswerInput) 
     VALUES (@HelpdeskID, 80, CASE @MinorCategoryID WHEN 87 THEN 129 END, Null) 
    END 

所以這個工作,但只有一個選擇 - 其中@MinorCategoryID = 87我想有超過1個語句設置@MinorCategoryID WHEN 91THEN 130等...

我已經試過......

IF EXISTS(SELECT * FROM TicketInformation WHERE TicketID = @HelpdeskID AND QuestionID = 80) 
UPDATE TicketInformation SET AnswerInput = Null, AnswerID = CASE @MinorCategoryID WHEN 87 THEN 129 WHERE TicketID = @HelpdeskID And QuestionID = 80 
ELSE INSERT INTO TicketInformation (TicketID, QuestionID, AnswerID, AnswerInput) VALUES (@HelpdeskID, 80, CASE @MinorCategoryID WHEN 87 THEN 129 END, Null) 



    IF EXISTS(SELECT * FROM TicketInformation WHERE TicketID = @HelpdeskID AND QuestionID = 80) 
UPDATE TicketInformation SET AnswerInput = Null, AnswerID = CASE @MinorCategoryID WHEN 91 THEN 130 WHERE TicketID = @HelpdeskID And QuestionID = 80 
ELSE INSERT INTO TicketInformation (TicketID, QuestionID, AnswerID, AnswerInput) VALUES (@HelpdeskID, 80, CASE @MinorCategoryID WHEN 91 THEN 130 END, Null) 

任何幫助表示讚賞 - 對不起,如果它不是清楚,我已經有了一個模糊星期五頭!

回答

13

您可以將其分配給一個變量,然後插入該變量。

ELSE 
    BEGIN 

     SELECT @MinorCategoryID = CASE 
       WHEN @MinorCategoryID = 87 THEN 129 
       WHEN @MinorCategoryID = 91 THEN 130 
      -- more cases here 
      ELSE NULL 
     END 
     INSERT INTO TicketInformation (TicketID, QuestionID, AnswerID, AnswerInput) 
     VALUES (@HelpdeskID, 80, @MinorCategoryID, Null) 
    END 

或通過選擇

ELSE 
    BEGIN     
     INSERT TicketInformation (TicketID, QuestionID, AnswerID, AnswerInput) 
     SELECT @HelpdeskID, 
       80, 
       CASE 
        WHEN @MinorCategoryID = 87 THEN 129 
        WHEN @MinorCategoryID = 91 THEN 130 
        -- more cases here 
        ELSE NULL 
       END, 
       Null 
    END 
+0

謝謝!我用你的代碼,將它改編完美! – anna

0

試試這個:

CASE WHEN @MinorCategoryID = 87 THEN 129 ELSE NULL END 

顯然,如果需要用另一個值替換ELSE情況下,NULL。

0

改變的值()嘗試對那些可能的場景創建列表表格。所以當新的情況出現時,你所要做的就是更新該表。

下面是代碼

if(OBJECT_ID('_MinorCategoryList') > 0) 
    drop table _MinorCategoryList 

create table _MinorCategoryList(
id int identity(1,1), 
[when] int, 
[then] int 
) 

insert into _MinorCategoryList ([when],[then]) 
values (87,129),(91,130) 

select * from _MinorCategoryList 

go 

alter Procedure [dbo].[usp_CreatePresetPriority] 
    @HelpdeskID int, 
    @MinorCategoryID int 
As 
BEGIN 

IF EXISTS(SELECT * FROM TicketInformation WHERE TicketID = @HelpdeskID AND QuestionID = 80) 
    BEGIN 
     UPDATE TicketInformation 
     SET AnswerInput = Null, 
      AnswerID = (SELECT [then] FROM _MinorCategoryList WHERE [when] = @MinorCategoryID) 
     WHERE TicketID = @HelpdeskID And QuestionID = 80 

    END 

ELSE 
    BEGIN 
     INSERT INTO TicketInformation (TicketID, QuestionID, AnswerID, AnswerInput) 
     VALUES (@HelpdeskID, 80, (SELECT [then] FROM _MinorCategoryList WHERE [when] = @MinorCategoryID), Null) 
    END 
END 

go 
+0

非常感謝您使用不同的表格 – anna