SQL Server中ISNULL函数的截断问题

时间:2016-09-17 08:45:16

标签: sql sql-server isnull

最近我遇到了Timestamp.toString("dd/MM/yyyy HH:mm")函数在第一个字符串为空时返回截断数据的情况。

ISNULL

我发现a是5个字符,b是10个字符,但是当a为空时,它只返回5个字符b而不是全长。

这是一个已知问题吗?

2 个答案:

答案 0 :(得分:8)

这是一种已知的行为

来自 MSDN

  

如果不是NULL,则返回check_expression的值;   否则,在隐式地返回replacement_value   如果类型不同,则转换为check_expression的类型。   如果replacement_value超过,则replacement_value可以被截断   check_expression。

使用COALESCE来解决此问题

SELECT COALESCE(a, b) From yourtable

这是一个演示

CREATE TABLE #nulltest 
  ( 
     a CHAR(5), 
     b CHAR(10) 
  ) 

INSERT INTO #nulltest 
VALUES      ('12345','1234567890'), 
            (NULL,'1234567890')   

SELECT a,   
       b, 
       ISNULL(a, b)   AS Isnull_Result, 
       COALESCE(a, b) AS Coalesce_Result 
FROM   #nulltest   

结果:

╔═══════╦════════════╦═══════════════╦═════════════════╗
║   a   ║     b      ║ Isnull_Result ║ Coalesce_Result ║
╠═══════╬════════════╬═══════════════╬═════════════════╣
║ 12345 ║ 1234567890 ║         12345 ║      12345      ║
║ NULL  ║ 1234567890 ║         12345 ║      1234567890 ║
╚═══════╩════════════╩═══════════════╩═════════════════╝

答案 1 :(得分:0)

除了@Prdp回答之外,你还可以使用CASE WHEN。

CASE WHEN a is null then b else a end AS caseWhen_Result