ISNULL / COALESCE对应的非NULL值

时间:2013-11-15 10:25:52

标签: sql sql-server tsql sql-server-2005 sql-function

是否存在与COALESCE类似的函数,但是对于不是NULL的值?

如果返回字符串文字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

但这样做效率很低,因为它需要每个记录执行两次函数。

请注意,此查询位于表值函数中。

3 个答案:

答案 0 :(得分:9)

也许您可以使用NULLIF功能,例如:

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

答案 1 :(得分:5)

如果您无法更改GetFirstSsnInFromSsnOut以返回Null-Values,请尝试以下操作:

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

答案 2 :(得分:5)

函数nullif如果参数相等则返回null,否则返回第一个参数。结合合并以获得乐趣和利润:

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