ISNULL(int,'')空字符串返回0,有没有办法覆盖?

时间:2016-06-21 21:26:16

标签: sql-server

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

2 个答案:

答案 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]