2013-07-16 120 views
3

我的邏輯只是必須是一個有點古怪,因爲當我測試,以確保這些CASE陳述是真實的,我不會得到預期的結果...使用SQL Server嵌套CASE語句2008

例如,如果Sample1 = 'FI'Sample2 = 'GOVT'Sample3 = 'GOVT',我沒有得到'OKFI' ...我知道我必須是具有某處着一些古怪的邏輯......

對這些事情的最佳實踐的任何想法?

CREATE FUNCTION SampleFunction 
(
    @Sample1 varchar(50), 
    @Sample2 varchar(50) = null, 
    @Sample3 varchar(50) = null 
) 
RETURNS VARCHAR(255) 
AS 
BEGIN 

declare @output varchar(255) 



SET @output = 

CASE WHEN @Sample1 = 'CASH' THEN 'CASH' 

WHEN @Sample1 = 'ST' THEN 
    CASE WHEN @Sample2 ='TBILL' THEN 
     CASE WHEN @Sample3 = 'TBILL' THEN 'OKFI' 

WHEN @Sample1 = 'FI' THEN 
    CASE WHEN @Sample2 = 'GOVT' THEN 
     CASE WHEN @Sample3 = 'GOVT' THEN 'OKFI' 

WHEN @Sample1 = 'DERV' THEN 
    CASE WHEN @Sample2 = 'CURRCONT' THEN 
     CASE WHEN @Sample3 = 'FORWARD' THEN 'CASH' 
      WHEN @Sample3 = 'SPOT' THEN 'CASH' 
WHEN @Sample2 = 'SWAP' THEN 
    CASE WHEN @Sample3 = 'CURRSWAP' THEN 'CASH' 
     WHEN @Sample3 = 'INDXSWAP' THEN 'OTHER' 

WHEN @Sample2 = 'FUTURE' THEN 
CASE WHEN @Sample3 = 'COMFUT' THEN 'COM' 
    WHEN @Sample3 = 'BFUT' THEN 'OKFI' 
    WHEN @Sample3 = 'NDXFUT' THEN 'OKSHARES' 
    WHEN @Sample3 = 'EQFUT' THEN 'OKSHARES' 
    WHEN @Sample3 = 'CURRFUT' THEN 'CASH' 

WHEN @Sample2 = 'OPTION' THEN 
CASE WHEN @Sample3 = 'CUROPTION' THEN 'CASH' END 

ELSE 'OTHER' 

END END END 
END END END 
END END END RETURN @Output 

END -- FUNCTION 
+0

'消息102,級別15,狀態1,過程SampleFunction 49行 附近有語法錯誤END'.' –

+0

這麼多的兩端.... – ObieMD5

+0

哎呀。讓我編輯過程以顯示適量的END。對不起,關於 – user2587725

回答

7

您應該創建@table變量,甚至與Sample1, Sample2, Sample3, Output列的物理永久表 - 插入所有的組合和理想的產出中,然後只需根據您@Sample1@Sample2@Sample3變量選擇它Output

通過這種方式,CASE內有數十個CASE,您將會迷路。

事情是這樣的:

CREATE FUNCTION SampleFunction2 
    (
     @Sample1 VARCHAR(50) , 
     @Sample2 VARCHAR(50) = NULL , 
     @Sample3 VARCHAR(50) = NULL 
    ) 
RETURNS VARCHAR(255) 
AS 
    BEGIN 

     DECLARE @output VARCHAR(255) 


     DECLARE @tempResults TABLE 
      (
       Sample1 VARCHAR(50) , 
       Sample2 VARCHAR(50) , 
       Sample3 VARCHAR(50) , 
       [Output] VARCHAR(255) 
      ) 

     INSERT INTO @tempResults 
     VALUES ('CASH', NULL, NULL, 'CASH')   
       ,('ST', 'TBILL', 'TBILL', 'OKFI') 
       ,('FI', 'GOVT', 'GOVT', 'OKFI') 
       ,('DERV', 'CURRCONT', 'FORWARD', 'CASH') 
       ,('DERV', 'CURRCONT', 'SPOT', 'CASH') 
       ,(NULL, 'SWAP', 'CURRSWAP', 'CASH') 
       ,(NULL, 'SWAP', 'INDXSWAP', 'OTHER') 
       ,(NULL, 'FUTURE', 'COMFUT', 'COM') 
       ,(NULL, 'FUTURE', 'BFUT', 'OKFI') 
       ,(NULL, 'FUTURE', 'NDXFUT', 'OKSHARES') 
       ,(NULL, 'FUTURE', 'EQFUT', 'OKSHARES') 
       ,(NULL, 'FUTURE', 'CURRFUT', 'CASH') 
       ,(NULL, 'OPTION', 'CUROPTION', 'CASH') 


     SELECT @output = [Output] 
     FROM @tempResults 
     WHERE (@Sample1 IS NULL OR Sample1 = @Sample1) 
      AND (@Sample2 IS NULL OR Sample2 = @Sample2) 
      AND (@Sample3 IS NULL OR Sample3 = @Sample3) 

     IF @output IS NULL SET @output = 'OTHER' 

     RETURN @output 
    END 

SQLFiddle DEMO

如果你想堅持的情況下,該問題與您原來的查詢亂放END S:

CREATE FUNCTION SampleFunction 
(
    @Sample1 varchar(50), 
    @Sample2 varchar(50) = null, 
    @Sample3 varchar(50) = null 
) 
RETURNS VARCHAR(255) 
AS 
BEGIN 

declare @output varchar(255) 



SET @output = 

CASE WHEN @Sample1 = 'CASH' THEN 'CASH' 

    WHEN @Sample1 = 'ST' THEN 
     CASE WHEN @Sample2 ='TBILL' THEN 
      CASE WHEN @Sample3 = 'TBILL' THEN 'OKFI' 
      END 
     END  

    WHEN @Sample1 = 'FI' THEN 
     CASE WHEN @Sample2 = 'GOVT' THEN 
      CASE WHEN @Sample3 = 'GOVT' THEN 'OKFI' 
      END 
     END 

    WHEN @Sample1 = 'DERV' THEN 
     CASE WHEN @Sample2 = 'CURRCONT' THEN 
      CASE WHEN @Sample3 = 'FORWARD' THEN 'CASH' 
       WHEN @Sample3 = 'SPOT' THEN 'CASH' 
      END 
     END  

    WHEN @Sample2 = 'SWAP' THEN 
     CASE WHEN @Sample3 = 'CURRSWAP' THEN 'CASH' 
      WHEN @Sample3 = 'INDXSWAP' THEN 'OTHER' 
     END 

    WHEN @Sample2 = 'FUTURE' THEN 
     CASE WHEN @Sample3 = 'COMFUT' THEN 'COM' 
      WHEN @Sample3 = 'BFUT' THEN 'OKFI' 
      WHEN @Sample3 = 'NDXFUT' THEN 'OKSHARES' 
      WHEN @Sample3 = 'EQFUT' THEN 'OKSHARES' 
      WHEN @Sample3 = 'CURRFUT' THEN 'CASH' 
     END 

    WHEN @Sample2 = 'OPTION' THEN 
     CASE WHEN @Sample3 = 'CUROPTION' THEN 'CASH' 
     END 

    ELSE 'OTHER' 


    END RETURN @Output 

END -- FUNCTION 

SQLFiddle DEMO

+0

我選擇了CASE語句,只是因爲它是一個函數,並且很可能永遠不會改變......我看到它是如何混淆和appreaciate更改解決方案。我將在我的下一個方法中使用它。非常感謝! – user2587725