3

CASEこれらのステートメントが正しいことを確認するためにテストすると、期待した結果が得られないため、私のロジックは少しファンキーである必要があります...

たとえば、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
4

1 に答える 1

8

@table 変数または列を持つ物理的な永続テーブルを作成する必要がありますSample1, Sample2, Sample3, Output。すべての組み合わせと必要な出力をそこに挿入し、変数に基づいて選択するだけですOutput@Sample1@Sample2@Sample3

このように、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 デモ

また、CASE に固執したい場合、元のクエリの問題はENDs の置き忘れです。

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 デモ

于 2013-07-16T15:02:22.663 に答える