2016-07-23 20 views
0

SQL Serverでユーザ定義関数を作成しましたが、何らかの理由で論理が正しくない場合、常にelse文が実行されます。助けてください!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 
+0

はあなたが私はあなたが私はに値を渡す方法を、だの寸法と重量 – Mike

+0

ください見上げているのレコードを表示することができます機能 – Mike

+0

を取り込むときの結果を示すために、全体のレコードを選択するために、いくつかのデバッグコードを追加することを示唆している –

答えて

4

あなたは、ロジックを持っている方法、常に最初のケース(> 100)、または他の(< 100)のいずれかをヒットするだろう。最初に大きい番号を調べてみてください。

最初に100を超えるケースを使用するため、300を超えるケースには当てはまりません。

elseステートメントを常に使用している場合は、値が実際に100より大きいかどうかを確認する必要があります。

+0

非常に今、それは完璧に動作しています!!!!!!! –

+0

問題が解決したことをお返事ありがとうございます。正解(@PhillipXT)を受け入れることで、彼は信用を得て、同様の問題を抱えた将来のユーザーが正しい答えを見つけるのを助けるのが通例です。 – Mike

1

クエリのうちの1つがNULL値を返すと思います。 nullは数字ではないので、elseの文と比較することはできないため、nullの場合はヒットします。これを防ぐには、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) 
+0

demention変数は、後でそれを分割しているため、デフォルトの1にする必要があります。 – PhillipXT

+0

個人的には、COALESCEを使用して値を設定するのではなく、CASE文でゼロ除算条件をチェックすることをお勧めします。分裂の後に@dementionが使用された場合、それを0ではなく1にする必要があります。ちょうど私の2セント。 –

+0

SELECT @ a = @ C = 0 THEN 0 ELSE @ b/@c END ...しかし、あなたは間違っていないと私は正しくない:) –

関連する問題