Sql ISNULL/合并非NULL值的对应项

Sql ISNULL/合并非NULL值的对应项,sql,sql-server,tsql,sql-server-2005,sql-function,Sql,Sql Server,Tsql,Sql Server 2005,Sql Function,是否有一个函数类似于合并,但用于非空的值 如果标量值函数返回字符串literalN/a,我需要用另一个值替换它的返回值。如果它返回NULL我可以使用: SELECT COALESCE(dbo.GetFirstSsnInFromSsnOut(RMA.IMEI), RMA.IMEI) AS [IMEI to credit] , OtherColumns FROM dbo.TableName 但是,由于它返回N/A,所以这不起作用。我还可以使用: SELECT CASE WHEN dbo.

是否有一个函数类似于
合并
,但用于非
空的值

如果标量值函数返回字符串literal
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
但这将是低效的,因为它需要每个记录执行两次函数


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

如果无法将
GetFirstSsnInFromSsnOut
更改为返回空值,请尝试以下操作:

选择COALESCE(dbo.GetFirstSsnInFromSsnOut(NULLIF(RMA.IMEI,'N/A')),RMA.IMEI)作为[IMEI to credit]
,其他栏目
从dbo.TableName

也许您可以在那里使用函数,例如:

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

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

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

但是你不能修改函数本身,使其返回NULL而不是N/A吗?@StephenByrne:这会导致其他问题/工作。因此,我首先问,是否有一种方法可以解决这个问题,而不必“打破改变”。该方法已在某些excel加载项中使用,我将不得不对其进行修改。创建另一个函数包装
GetFirstSsnInFromSsnOut
,并将N/A更改为
NULL
,怎么样?这样做,您可以使用
COALESCE
,并且仍然只有一个对
GetFirstSsnInFromSsnOut
@TimSchmelter的调用-这可能会执行函数两次@马丁史密斯:真的,为什么?我能以某种方式防止这种情况吗?请参阅上面链接的连接项。如果由于
COALESCE
如何扩展到
CASE
而导致计划显示两次引用的函数,那么您可以将
COALESCE
替换为
ISNULL
I将COALESCE更改为ISNULL(我个人在大多数情况下使用ISNULL),似乎
COALESCE
总是扩展到
CASE
。让我大开眼界!感谢大家,你是最快的,但是Andrey的答案包含了我搜索过的函数和链接。不管怎么说,我已经把三个人都投了赞成票。