2016-09-28 2 views
1

私は別の値を含めるために展開する必要のある動作中のステートメントを持っています。その値は0です。次のように今、私の文は次のとおりです。私は成功せずORオペレータでこれを再書き込みするためのいくつかの方法を試してみましたSQL Server:OR文をNULLにするケースを結合する方法

CASE 
    WHEN dbo.tbl.Price IS NULL 
     THEN CAST(dbo.tbl.cost AS NUMERIC(18 , 1)) * 2.2 
    ELSE dbo.tbl.Price 
END 

CASE 
    WHEN dbo.tbl.Price IS NULL 
     THEN CAST(dbo.tbl.cost AS NUMERIC(18 , 1)) * 2.2 
    OR WHEN 0 
     THEN CAST(dbo.tbl.cost AS NUMERIC(18 , 1)) * 2.2 
    ELSE dbo.tbl.Price 
END 

誰でも助けることができます:以下を含む

おかげ

答えて

2

あなたはcase文を必要としないが、明確に、このために設計されたisNull(arg1, arg2)という名前の別の関数があります。 この関数は、nullでない場合は最初の引数を返し、最初の引数がnullの場合は2番目の引数を返します。

isNull(dbo.tbl.Price , CAST(dbo.tbl.cost AS NUMERIC(18 , 1)) * 2.2) 

実際にこの任意の数の引数に2を取り、ヌルでない、リスト内の最初のものを返すので、あなたも書くことができcoalesce()という名前の、より一般的なfiunctionの特殊なケース:

coalesce(dbo.tbl.Price , CAST(dbo.tbl.cost AS NUMERIC(18 , 1)) * 2.2) 

dbo.tbl.Price = 0の場合はさらに複雑な式を返したいので、最初の引数が2番目の引数と等しい場合はnullを返す関数NullIf(arg1, arg2)も使用する必要があります。

isNull(Nullif(dbo.tbl.Price, 0), CAST(dbo.tbl.cost AS NUMERIC(18 , 1)) * 2.2) 

または

coalesce(Nullif(dbo.tbl.Price, 0), CAST(dbo.tbl.cost AS NUMERIC(18 , 1)) * 2.2) 
+0

おかげでチャールズを試してみて、この文は動作しますが、文の一部が挿入されているtaのtbl.Price値がNULLであるすべてのレコードでテーブル "以下のスニペットはテーブルにあるものです キャスト(dbo.zItemInventoryAll.Factor AS数値(18、1))* 2.2 –

+0

これは私には明らかです。 'xItemInventory.Factor'はどこから来ますか?その構文や名前、またはあなたの質問のどこにも言及されていないもの。使用している実際のSQLと、SQL式の出力として表示されている完全な結果を確認(または投稿)してください。 –

+0

申し訳ありませんが、テーブル名を簡略化して忘れていました。私はクリップボードにセルの内容をコピーしました。 CAST(dbo.tbl.cost AS NUMERIC(18、1))* 2.2 –

0

この

CASE 
    WHEN dbo.tbl.Price IS NULL THEN CAST(dbo.tbl.cost AS NUMERIC(18 , 1)) * 2.2 
    WHEN dbo.tbl.Price = 0 THEN CAST(dbo.tbl.cost AS NUMERIC(18 , 1)) * 2.2 
    ELSE dbo.tbl.Price 
END 
+1

より簡単なケースはtbl.Price IS NULLまたはtbl.Price = 0 THEN (tbl.Price、0)= THEN .....ある条件から別の条件に同じ数式をコピーする必要がなくなります。 – Matt

+0

Ashさんのおかげで、このステートメントはエラーになります。具体的には、varvhar値 '1599.00'をデータ型intに変換すると変換に失敗しました。 Matt、簡単な文で詳しく説明できますか?CASE WHEN ISNULL(tbl.Price、0)= THENどうしますか? –

+0

@BL - エラーが発生したと思う唯一の理由は、tbl.Priceが数値データ型ではないことです。 "ELSE CAST(tbl.price as Numeric(18,1)")のようにelse式を数値にキャストしてみてください。 – ash

関連する問題