2016-09-28 94 views
1

我有一個工作語句,我需要擴展以包含另一個值;該值爲0。現在,我的發言如下:SQL Server:如何將CASE WHEN與NULL結合使用OR語句

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

我試圖要重新寫這與OR操作沒有成功的幾種方法。

包括以下內容:

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,則返回第二個參數。

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

這實際上名爲coalesce()更一般的fiunction這需要2到任意數量的參數和返回非空列表中的第一個,所以你也可以寫一個特殊情況:

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

因爲您還想在dbo.tbl.Price = 0時返回更復雜的表達式,所以您還必須使用函數NullIf(arg1, arg2),如果第一個參數等於第二個參數,則返回null,如果它們不相等,則返回第一個參數。

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表格「下面的代碼片段是表格 CAST(dbo.zItemInventoryAll.Factor AS NUMERIC(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或甚至更簡單CASE當ISNULL(tbl.Price,0)= THEN .....消除不得不將相同的公式從一個條件複製到另一個條件... – Matt

+0

謝謝Ash,這個聲明導致錯誤;具體而言:將varvhar值'1599.00'轉換爲數據類型int時轉換失敗。 馬特,你能否詳細說明你的簡單陳述:CASE when ISNULL(tbl.Price,0)= THEN please? –

+0

@BL - 我能想到發生錯誤的唯一原因是tbl.Price不是數字數據類型。嘗試將其他表達式轉換爲數字,如「ELSE CAST(tbl.price as Numeric(18,1)」 – ash