Sql 处理空白查询结果,ISNULL(NULLIF())

Sql 处理空白查询结果,ISNULL(NULLIF()),sql,sql-server,Sql,Sql Server,我试图将查询结果返回到变量中,以便我能够在insert语句中使用它。但是,我的select始终返回null,即使我相信已正确设置了ISNULL(NULLIF()) declare @test varchar(10) set @test = (select ISNULL(NULLIF(discnumber,''),'NA') from discmaster where meteredfilename = '3501' or nonmeteredfilename='3501') select

我试图将查询结果返回到变量中,以便我能够在insert语句中使用它。但是,我的select始终返回null,即使我相信已正确设置了
ISNULL(NULLIF())

declare @test varchar(10)

set @test =  (select ISNULL(NULLIF(discnumber,''),'NA')
from discmaster
where meteredfilename =  '3501' or nonmeteredfilename='3501')

select @test
它似乎正确,但仍然返回一个
NULL
值。您会选择大小写,但也不能100%确定该方法。

而不是
ISNULL(NULLIF(discnumber),,'NA')


尝试
COALESCE(discnumber,'NA')
我会将
ISNULL
移到子查询之外-如果子查询没有返回结果怎么办

set @test =  COALESCE(
           (select NULLIF(discnumber,'')
              from discmaster
              where meteredfilename =  '3501' or nonmeteredfilename='3501')
       ,'NA')

(我也是个势利小人,将
ISNULL
替换为
COALESCE
。在少数情况下,
coalsce
是更好的函数)。

select语句仍然使用COALESCE返回空值discnumber是哪种SQL字段?您能为discmaster提供表定义吗?同意,这可能是一个不返回任何行的查询。但是:为什么说
COALESCE
从根本上优于
ISNULL
?@Philip-因为它可以泛化为两个以上的参数,并且返回类型基于两个(或所有)参数类型(即它使用类型优先规则),而不是试图强制第二个参数的类型为第一个参数的类型。例如,
选择ISNULL(CAST(null为CHAR(2)),'abc')
返回
'ab'
。太棒了,成功了。谢谢大家的帮助。n@Damien_The_Unbeliever返回类型基于所有参数类型是什么意思?这与isnull相比如何?如果一个参数中有一个varchar,另一个参数中有一个int,那么它的返回类型是什么?或者varbinary,varchar,int?@FistOfFury-我在前面的评论中给出了一个例子-如果您有
ISNULL(char(2),varchar(50))
,您将得到
char(2)
结果
COALESCE(char(2),varchar(50))
将返回一个
varchar(50)
。对于
varchar,int
,它将强制它成为
varchar
(这可能是您想要的,但如果我不想要
int
结果,我更愿意遵循通常的优先规则并插入显式转换)