Sql server SQL Server if-else语句工作不正常

Sql server SQL Server if-else语句工作不正常,sql-server,Sql Server,我已经在SQL Server中创建了用户定义的函数,但不知为什么逻辑不正确,它总是执行else语句;请帮忙 CREATE FUNCTION shipSelection (@Item_No varchar(20),@itemname varchar(20)) RETURNS varchar(100) AS BEGIN declare @weight float declare @demention float declare @density float d

我已经在SQL Server中创建了用户定义的函数,但不知为什么逻辑不正确,它总是执行else语句;请帮忙

CREATE FUNCTION shipSelection
    (@Item_No varchar(20),@itemname varchar(20))
RETURNS varchar(100)
AS
BEGIN
    declare @weight float
    declare @demention float
    declare @density float
    declare @result varchar(100)

    SET @weight = (SELECT Item_Weight FROM Items 
                   WHERE Item_No = @Item_No AND Name = @itemname) 
    SET @demention = (SELECT Dimention FROM Items 
                      WHERE Item_No = @Item_No AND Name = @itemname)

    SELECT @density = @weight / @demention

    IF @density > 100
    BEGIN
        SET @result = 'LOW DENSITY CAN USE ANY TYPE SHIPS';
    END
    ELSE IF @density > 300
    BEGIN
       SET @result = 'MEDIUM DENSITY CAN USE MEDIUM SHIPS';
    END
    ELSE IF @density > 500
    BEGIN
        SET @result = 'MEDIUM DENSITY WANT TO USE HUGE SHIPS';
    END
    ELSE 
    BEGIN
       SET @result = 'DONT WANT TO CARE ABOUT SHIPS TOO SMALL DENSITY ITEM';
    END

    RETURN @result
END

SELECT 
    dbo.shipSelection('I010', 'asus x555l') AS TRANSPORT_SHIP_TYPE

按照你的逻辑,它总是会碰到第一种情况(>100),或者其他情况(<100)。试着先检查最大的数字

它永远不会命中>300的大小写,因为它将首先使用>100的大小写


如果您总是点击else语句,则需要检查您的值是否实际大于100。听起来好像不是这样。

按照你的逻辑,它总是会碰到第一种情况(>100),或者其他情况(<100)。试着先检查最大的数字

它永远不会命中>300的大小写,因为它将首先使用>100的大小写


如果您总是点击else语句,则需要检查您的值是否实际大于100。听起来好像不是。我打赌您的一个查询返回空值。由于null不是一个数字,不能与数字进行比较,因此在null的情况下,将命中else语句。通过使用
COALESCE
将返回null的查询值设置为已知值,可以防止出现这种情况

    SET @weight = (SELECT COALESCE(Item_Weight,0) FROM Items 
                   WHERE Item_No = @Item_No AND Name = @itemname) 
    SET @demention = (SELECT COALESCE(Dimention,0) FROM Items 
                      WHERE Item_No = @Item_No AND Name = @itemname)

我打赌您的一个查询返回空值。由于null不是一个数字,不能与数字进行比较,因此在null的情况下,将命中else语句。通过使用
COALESCE
将返回null的查询值设置为已知值,可以防止出现这种情况

    SET @weight = (SELECT COALESCE(Item_Weight,0) FROM Items 
                   WHERE Item_No = @Item_No AND Name = @itemname) 
    SET @demention = (SELECT COALESCE(Dimention,0) FROM Items 
                      WHERE Item_No = @Item_No AND Name = @itemname)

你能显示你正在查找的记录吗?请我建议你添加一些调试代码来选择的整个记录,以便在填充维度和权重时显示结果,如何将值传递给函数能否显示正在查找的记录请我建议您添加一些调试代码来选择的整个记录,以便在填充维度和权重时显示结果也就是说,如何将值传递给函数维度变量可能默认为1,因为他后来用它做除法。就个人而言,我更喜欢用CASE语句检查除法条件,而不是用COALESCE设置值。如果在除法之后使用@demention,那么你需要保持它的精神计数为1而不是零。只要我的两分钱。当@c=0时选择@a=CASE,然后选择0其他@b/@c END…但是你没有错,我也不对:)只要在除法之前检查它,一切都好:)demention变量应该默认为1,因为他在之后用它除法。就我个人而言,我更喜欢用CASE语句检查除以零的条件,而不是使用COALESCE设置值。如果在除法之后使用@demention,那么你需要保持它的精神计数为1而不是零。只要我的两分钱。当@c=0时选择@a=CASE,然后选择0其他@b/@c END…但是你没有错,我也没有错:)只要在除法之前检查过,一切都好:)谢谢你回复我们,它解决了你的问题。习惯上会接受正确的答案(@PhillipXT),这样他就可以获得积分,并帮助未来有类似问题的用户找到正确答案。感谢您回复我们,它解决了您的问题。人们习惯于接受正确的答案(@PhillipXT),这样他就可以获得信任,并帮助将来遇到类似问题的用户找到正确答案。