CAST(c.CNumber AS VARCHAR(2)) + '.'
+ CAST(cc.Card AS VARCHAR(2)) + '.'
+ CAST(CASE WHEN ce1.Id IS NOT NULL
THEN ISNULL(cerp.CERP, ' ')
ELSE ISNULL(cpa.Port, ' ')
END AS VARCHAR(2)) AS [IDPool]
假设CNumber为3,Card为50,此查询的显示为3.50.0。问题是我需要找到一种方法来覆盖ISNULL和COALESCE中存在的数据类型优先级和首次列出的变量限制。我不能将最后一个数字设为0,我需要它不显示任何内容。我试过铸造无济于事。也许这甚至不可能做到?
编辑 - 道歉,第一篇文章,我看了别处。
如果ce1.Id不为null,那么如果cerp.CERP为null我需要传递一个空字符串,所以结果应该是,比方说3.50。但是因为ISNULL采用第一个传递的参数的数据类型(在这种情况下是一个int),它将该空字符串转换为0,结果为3.50.0问题是我最终不能将它设为0
答案 0 :(得分:2)
我想我理解......在互联网的这一方面肯定不是很清楚。
CAST(c.CNumber AS VARCHAR(2)) + '.'
+ CAST(cc.Card AS VARCHAR(2)) + '.'
+ CAST(CASE WHEN ce1.Id IS NOT NULL
THEN ISNULL(convert(varchar(2), cerp.CERP), ' ')
ELSE ISNULL(convert(varchar(2), cpa.Port), ' ')
END AS VARCHAR(2)) AS [IDPool]
答案 1 :(得分:0)
您需要在ISNULL
函数内部而不是在函数外部转换参数值,以便函数的结果类型是您想要的类型。此外,如果您不希望在值为null时显示句点,则可以在ISNULL
函数中包含字符串连接,以便它们消失。
declare @CNumber as int = 3
declare @Card as int = 50
declare @Id as int
declare @CERP as int
declare @Port as int
select
CAST(@CNumber AS VARCHAR(2)) + '.'
+ CAST(@Card AS VARCHAR(2))
+ CASE WHEN @Id IS NOT NULL
THEN ISNULL('.' + cast(@CERP as varchar(2)), '')
ELSE ISNULL('.' + cast(@Port as varchar(2)), '')
END AS [IDPool]