How to use a case statement in scalar valued function in SQL?

前端 未结 6 1424
半阙折子戏
半阙折子戏 2020-12-31 04:26

I want to get one value from a function using a case statement. I tried the following but it does not work:

CREATE FUNCTION [FATMS].[fnReturnByPeriod]
(

            


        
相关标签:
6条回答
  • 2020-12-31 04:56

    You are not assigning @Period anywhere. Try with when @Period >1 and @Period <=7 then SET @Period = 1 and subsequently for all the other lines.

    SQL does not have implicit returns and so you always have to set the variables before you return them.

    0 讨论(0)
  • 2020-12-31 05:01

    There are two types of CASE expression: simple and searched. You must choose one or the other - you can't use a mixture both types in one expression.

    Try this:

    SELECT CASE
        WHEN @Period = 1 THEN 1
        WHEN @Period > 1 AND @Period <= 7 THEN 2
        WHEN @Period > 7 AND @Period <= 30 then 3
        -- etc...
        ELSE 0
    END
    

    Also, you need to assign the result to something as others have already pointed out.

    0 讨论(0)
  • 2020-12-31 05:03

    Declare a second variable and then set that value because you aren't resetting @Period.

    For example:

    DECLARE @Output AS INT
    
    SELECT @Output = CASE @Period 
                     WHEN 1 then 1     
                     WHEN @Period > 1 AND @Period <= 7 THEN 1      -- Should be 2 
                     WHEN @Period > 7 AND @Period <= 30 THEN 1     -- Should be 3
                     WHEN @Period > 30 AND @Period<= 90 THEN 1     -- Should be 4
                     WHEN @Period > 90 AND @Period <= 180 THEN 1   -- Should be 5  
                     WHEN @Period > 180 AND @Period <= 360 THEN 1  -- Should be 6   
                     ELSE 0 END;
    
    RETURN @Output;
    

    I have left it like this as I'm assuming you are going to change your values for each of these CASE statements.

    0 讨论(0)
  • 2020-12-31 05:05

    In what way does it "not work"? Does it produce an error when you try to execute it? Does it return an unexpected result?

    Off the top of my head, there are several problems:

    Your case statement returns 1 in all cases.

    The case statement is also combining two different types of CASE semantics:

    CASE @Period 
    WHEN <condition> THEN <result>
    WHEN <other condition> THEN <result>
    ELSE <result>
    END
    

    or

    CASE
    WHEN @Period = <value> THEN <result>
    WHEN @Period = <other value> THEN <result>
    ELSE <result>
    END
    

    The second form allows you to use unrelated conditions, whereas the first can only check for different values of @Period.

    Further, you're returning the value of @Period, not the value generated by the CASE statement.

    0 讨论(0)
  • 2020-12-31 05:05

    Here's a SET based approach to write your function in SQL Server 2008

    CREATE FUNCTION [FATMS].[fnReturnByPeriod]
    (
        @Period INT
    )
    RETURNS int
    AS
    BEGIN
        return isnull((SELECT min(v)
        from (values
         (1,1),
         (7,2),
         (30,3),
         (90,4),
         (180,5),
         (360,6)) t(n,v)
        where n >= @Period and @period>0), 0)
    END
    

    The way you have written it, all the CASE branches return 1, so you might as well use

    return case when @period between 1 and 360 then 1 else 0 end
    
    0 讨论(0)
  • 2020-12-31 05:12

    When you use RETURN @Period, you must assign a value to @Period. The following example shows how to structure your code so that there is no need to declare a local variable.

    CREATE FUNCTION [FATMS].[fnReturnByPeriod]
    (
        @Period INT
    )
    RETURNS INT
    AS
    BEGIN
        RETURN
            CASE 
                WHEN @Period = 1 THEN 1
                WHEN @Period > 1 AND @Period <=7 THEN 1
                WHEN @Period > 7 AND @Period <=30 THEN 1
                WHEN @Period > 30 AND @Period<=90 THEN 1
                WHEN @Period > 90 AND @Period <=180 THEN 1
                WHEN @Period > 180 AND @Period <=360 THEN 1
                ELSE 0
            END 
    END
    
    0 讨论(0)
提交回复
热议问题