ISNULL/COALESCE对应的非NULL值

Tim*_*ter 3 sql t-sql sql-server 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
Run Code Online (Sandbox Code Playgroud)

但既然它返回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
Run Code Online (Sandbox Code Playgroud)

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

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

And*_*zov 9

也许你可以使用NULLIF函数,例如:

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

  • @TimSchmelter - 无论如何,这可能会执行两次.[`ISNULL`通常比`COALESCE`更好.](http://connect.microsoft.com/SQLServer/feedback/details/336002/unnecessarily-bad-performance-for-coalesce-subquery) (2认同)
  • 似乎`COALESCE`总是扩展为`CASE`.让我大开眼界!http://msdn.microsoft.com/en-us/library/ms190349.aspx (2认同)

det*_*ail 5

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

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


Sim*_*mon 5

函数nullif如果参数相等则返回null,否则返回第一个参数.与coalesce结合起来获得乐趣和利润:

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