TSQL函数If,Else或Case

时间:2015-01-15 06:30:37

标签: sql-server function tsql

好的,所以我有一份学校的作业: 编写一个名为ShippingCost的函数,它将接受WeightAmount和WeightType的值 根据以下逻辑返回运费的美元金额:如果重量以磅为单位,则运费为8美元 每磅。如果重量以克为单位,运费为每克0.03美元。 1.如果函数被调用如下:ShippingCost(2,'LB')它应该返回16.00 2.如果函数被调用如下:ShippingCost(2,'G')它应该返回0.06

我在试图弄明白我是怎么做的时候有点茫然。这就是我所拥有的,而且它无法工作。我不太明白这个概念。任何帮助都将不胜感激。

Create Function ShippingCost (@ShippingCost DECIMAL (8,2))
RETURNS DECIMAL
AS
    BEGIN
            DECLARE @ShippingCostLB decimal (8,2)
            DECLARE @ShippingsCostG decimal (8,2)
            DECLARE @ShippingWeight decimal (8,2)
            DECLARE @WeightType char (2)
            SET @ShippingCostLB = '8'
            SET @ShippingsCostG = '.03'
            SET @WeightType = ''
            SET @ShippingWeight = ''
    END
                    IF @WeightType = 'LB'
                    BEGIN
                        SET @ShippingCost = @ShippingWeight*@ShippingCostLB
                    END
                ELSE
                    BEGIN
                        SET @ShippingCost = [Weight]*@ShippingsCostG
                    END
    RETURN @ShippingCost
    END

1 个答案:

答案 0 :(得分:0)

您的代码看起来与您的作业无关。

首先 - 它明确表示你的函数应该为WeightAmountWeightType输入值 - 那么为什么它需要ShippingCost作为输入并将WeightType声明为局部变量?

第二 - 第13行END的目的是什么?实际上,由于END关键字不匹配,您的函数无法编译。

函数体 - 根据你的描述是非常简单的条件,它的实现非常简单:

Create Function ShippingCost (@WeightAmount DECIMAL (8,2), @WeightType char(2))
RETURNS DECIMAL
AS
BEGIN
        DECLARE @ShippingCost decimal (8,2)

        IF @WeightType = 'LB'
            SELECT @ShippingCost = 8 * @WeightAmount
        ELSE IF @WeightType = 'G'
            SELECT @ShippingCost = 0.03 * @WeightAmount

       RETURN @ShippingCost
END

请注意,条件(在您的情况下是整个函数)可以使用case语句以更简单易读的形式编写:

Create Function ShippingCost (@WeightAmount DECIMAL (8,2), @WeightType char(2))
RETURNS DECIMAL
AS
BEGIN

    RETURN CASE
               WHEN @WeightType = 'LB' THEN 8 * @WeightAmount
               WHEN @WeightType = 'G' THEN 0.03 * @WeightAmount
           END
END