2014-10-06 108 views
4

嗨,我有一些問題SQL檢查是零或空

需要檢查是列空或零,如果事情做錯了一些算法

這是一個表:

col1 col2 col3 col4 
1  0  3376 0 
2  600  null 14468.5714 
3  null 0  0 
4  600  3376 null 

COALESCE不適用於零「0」值,case其太大

需要實現一些

, CAST(COALESCE(col2, (col3/7), (col4/30)) as money) col2 
, CAST(COALESCE(col3, (col2*7), (col4/30*7))as money) col3 
, CAST(COALESCE(col4, (col3/7*30),(col2*30))as money) col4 

如何以最快的方式解決這個問題。 THANX

+0

你是說,你需要遇到0對空進行區分?我認爲「null或0」可以被模糊地解釋。 – Kritner 2014-10-06 17:55:38

回答

2

爲什麼不直接使用CASE條件像

CASE WHEN col2 is not null and col2 <> 0 THEN your_calculation 
1

你可以做一個子查詢使用CASE語句來檢查零和返回NULL。 然後您可以在子查詢上運行您當前的查詢。

我看到使用的情況將是醜陋的,你有3個表達式COALESCE

SELECT 
CAST(COALESCE(col2 , (col3/7), (col4/30)) as money) col2 
, CAST(COALESCE(col3, (col2*7), (col4/30*7))as money) col3 
, CAST(COALESCE(col4, (col3/7*30),(col2*30))as money) col4 
from 
(SELECT case when col2 =0 then NULL else col2 end as col2, 
    case when col3 =0 then NULL else col3 end as col3, 
    case when col4 =0 then NULL else col4 end as col4 
from Table1) T 
2

雖然COALESCE可以讓你用一個特定值代替NULL,NULLIF將允許您用替換特定值空值。你可以使用後者0,並與像這樣結束:

, CAST(
    COALESCE(
     NULLIF(col2, 0), 
     NULLIF(col3, 0)/7, 
     NULLIF(col4, 0)/30 
    ) AS money 
) AS col2 
, CAST(
    COALESCE(
     NULLIF(col3, 0), 
     NULLIF(col2, 0) * 7, 
     NULLIF(col4, 0)/30 * 7) 
    ) AS money 
) AS col3 
, CAST(
    COALESCE(
     NULLIF(col4, 0), 
     NULLIF(col3, 0)/7 * 30, 
     NULLIF(col2, 0) * 30 
    ) AS money 
) AS col4 

還比較長,如果你問我,但絕對比使用的情況下更短。每個表達式中的最後一個NULLIF可能是不必要的,爲了一致性,我將它們留在那裏。也許你可以在每個地方添加0的第四個參數,只是爲了確保結果永遠不是NULL。

0

可以使用NULLIF功能:

,CAST(COALESCE(NULLIF(col2,0), NULLIF(col3/7,0), NULLIF(col4/30,0)) as money) col2 
,CAST(COALESCE(NULLIF(col3,0), NULLIF(col2*7,0), NULLIF(col4/30*7,0))as money) col3 
,CAST(COALESCE(NULLIF(col4,0), NULLIF(col3/7*30,0),NULLIF(col2*30,0))as money) col4