2017-03-07 43 views
0

当查询结果为空但查询仍然返回null时,我试图显示00001。我不知道我的查询有什么问题。SQL ISNULL不起作用

编辑:

假设OBRNo123-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

我不知道一个NULL结果匹配'WHERE LEN (a.OBRNo)= 20' – devio

+0

我会首先确保'a.OBRNo'不是一个空字符串 – anatol

+1

查询不返回null - 它不返回*任何*。 'isnull'不能创建没有的行。并且它永远不会返回任何空的'a.OBRNo'值,因为你用'len(a.OBRNo)= 20'来过滤,这对于一个空值将永远是虚假的(即使它不会,它仍然肯定不会是20 :))。您可能需要检查空值在ANSI SQL中的工作方式 - 正确的做法非常重要。 – Luaan

回答

4

NULL比较与IS NULL/IS 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

我认为这个问题是关于另一个案件 - 'ISNULL(a.OBRNo,'00001')作为ISNULL' – anatol

+0

@anatol不,这是关于OP对结果的误解 - 他没有结果,也没有结果。正如Tim指出的那样,原因是错误的过滤器。 – Luaan

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 NULLNULL所以NULL = 20NULLNULL AND a.ActionCode = 1NULL,当过滤视为FALSE