2013-11-15 81 views
3

是否有與COALESCE類似的函數,但值不是NULL對於非NULL值的ISNULL/COALESCE對象

如果它返回字符串文字N/A,我需要用另一個值替換標量值函數的返回值。如果將返回NULL我可以使用:

SELECT COALESCE(dbo.GetFirstSsnInFromSsnOut(RMA.IMEI), RMA.IMEI) AS [IMEI to credit] 
    , OtherColumns 
FROM dbo.TableName 

但由於它返回N/A這不起作用。我還可以使用:

SELECT CASE WHEN dbo.GetFirstSsnInFromSsnOut(RMA.IMEI)='N/A' 
     THEN RMA.IMEI 
     ELSE dbo.GetFirstSsnInFromSsnOut(RMA.IMEI) 
     END AS [IMEI To Credit]   
    , OtherColumns 
FROM dbo.TableName 

但由於它需要每個記錄兩次執行的功能,這將是低效的。

請注意,此查詢是在一個表值函數。

+0

但是你不能只修改函數'GetFirstSsnInFromSsnOut'本身返回NULL,而不是N/A? –

+0

@StephenByrne:這會導致其他問題/工作。所以我首先問是否有辦法在沒有「突變」的情況下解決這個問題。該方法已經在一些excel插件中使用,我將不得不修改。 –

+0

如何創建另一個函數來封裝'GetFirstSsnInFromSsnOut'並將N/A更改爲'NULL'?這樣做,你可以使用'COALESCE',並且仍然只有一個調用'GetFirstSsnInFromSsnOut' – neutrino

回答

9

也許還有你可以用NULLIF功能,例如:

SELECT ISNULL(NULLIF(dbo.GetFirstSsnInFromSsnOut(RMA.IMEI), 'N/A'), RMA.IMEI) AS [IMEI to credit] 
    , OtherColumns 
FROM dbo.TableName; 
+2

@TimSchmelter - 無論如何這可能會執行兩次。 ['ISNULL'通常比'COALESCE'更好](http://connect.microsoft.com/SQLServer/feedback/details/336002/unnecessarily-bad-performance-for-coalesce-subquery) –

+0

@MartinSmith:真的,爲什麼?我能以某種方式阻止嗎? –

+1

查看上面鏈接的連接項目。如果由於'COALESCE'擴展爲'CASE'如何計劃顯示兩次引用的函數,那麼您可以用'ISNULL'代替'COALESCE' –

5

如果你不能改變GetFirstSsnInFromSsnOut返回NULL值那麼試試這個:

SELECT COALESCE(dbo.GetFirstSsnInFromSsnOut(NULLIF(RMA.IMEI, 'N/A')), RMA.IMEI) AS [IMEI to credit] , OtherColumns FROM dbo.TableName

+0

感謝大家,你是最快的,但安德烈的答案包含我搜索的功能和鏈接。無論如何,我已經投票贊成所有三項。 –

5

功能NULLIF如果參數相等則返回null,否則返回第一個參數。與聚結結合的樂趣和利潤:

select 
    coalesce(
     nullif(dbo.GetFirstSsnInFromSsnOut(RMA.IMEI), 'N/A'), 
     RMA.IMEI 
    ) as [IMEI To Credit] 
    , OtherColumns 
from dbo.TableName