SQL ISNULL无法正常工作

时间:2017-03-07 08:12:48

标签: sql sql-server isnull case-when

我在查询结果为null但查询仍返回null时尝试显示00001。我不知道我的查询有什么问题。

编辑:

假设OBRNo 123-5678-10-13-1619表示LEN(a.OBRNo) is 19

SELECT TOP 1 CASE WHEN RIGHT(a.OBRNo, 5) = NULL THEN '00001' ELSE a.OBRNo 
END as CaseWhen, 
ISNULL(a.OBRNo, '00001') as ISNULL,
RIGHT(OBRNo, 5) as OrderBy
FROM tbl_T_BMSCurrentControl as a
WHERE LEN(a.OBRNo) = 20 and a.ActionCode = 1
ORDER BY OrderBy DESC

enter image description here

2 个答案:

答案 0 :(得分:4)

使用NULL / IS NULLIS NOT NULL进行比较,而不与= NULL进行比较。

SELECT TOP 1 CASE WHEN RIGHT(a.OBRNo, 5) IS NULL THEN '00001' ELSE a.OBRNo END
...

您可以使用SET ANSI_NULLS更改此行为。

默认情况下,您无法与=进行比较的原因是:NULL表示未定义。没有任何东西等于未知,甚至不是NULL。如果您与NULL进行比较,则结果未知,因此NULL

答案 1 :(得分:1)

您的查询是否返回任何行?

您的ISNULL (x,y)应该按预期执行,但由于WHERE,您的NULLS似乎正在过滤所有记录。

试试这个:

SELECT TOP 1 CASE WHEN RIGHT(a.OBRNo, 5) = NULL THEN '00001' ELSE a.OBRNo 
END as CaseWhen, 
ISNULL(a.OBRNo, '00001') as ISNULL,
RIGHT(OBRNo, 5) as OrderBy
FROM tbl_T_BMSCurrentControl as a
WHERE (a.OBRNo IS NULL OR LEN(a.OBRNo) = 20) and a.ActionCode = 1
ORDER BY OrderBy DESC

LEN(a.OBRNo) a.OBRNo NULL将为NULL,因此NULL = 20将为NULLNULL AND a.ActionCode = 1将为NULL被视为FALSE