2013-07-16 121 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