TSQL 函数 If、Else 或 Case
TSQL Function If, Else, or Case
好的,我有一份学校作业要交,上面写着:
编写一个名为 ShippingCost 的函数,它将接受 WeightAmount 和 WeightType 的值,然后
return 基于此逻辑的运费金额:如果重量以磅为单位,则运费为 8 美元
每磅。如果重量以克为单位,运费为每克 0.03 美元。
1. 如果像这样调用函数:ShippingCost(2, ‘LB’) 它应该 return 16.00
2. 如果像这样调用函数:ShippingCost(2,'G') 它应该 return 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
您的代码看起来与您的作业关系不大。
首先 - 它明确表示你的函数应该接受 WeightAmount
和 WeightType
的输入值 - 所以为什么它接受 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
好的,我有一份学校作业要交,上面写着: 编写一个名为 ShippingCost 的函数,它将接受 WeightAmount 和 WeightType 的值,然后 return 基于此逻辑的运费金额:如果重量以磅为单位,则运费为 8 美元 每磅。如果重量以克为单位,运费为每克 0.03 美元。 1. 如果像这样调用函数:ShippingCost(2, ‘LB’) 它应该 return 16.00 2. 如果像这样调用函数:ShippingCost(2,'G') 它应该 return 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
您的代码看起来与您的作业关系不大。
首先 - 它明确表示你的函数应该接受 WeightAmount
和 WeightType
的输入值 - 所以为什么它接受 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