SQL ISNULL不工作

SQL ISNULL不工作,sql,sql-server,isnull,case-when,Sql,Sql Server,Isnull,Case When,当查询结果为null但查询仍然返回null时,我试图显示00001。我不知道我的问题出在哪里 编辑: 假设OBRNo为123-5678-10-13-1619表示LEN(a.OBRNo)为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 OrderB

当查询结果为null但查询仍然返回null时,我试图显示
00001
。我不知道我的问题出在哪里

编辑:

假设
OBRNo
123-5678-10-13-1619
表示
LEN(a.OBRNo)为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

比较
为空
/
不为空
,不为
=空

SELECT TOP 1 CASE WHEN RIGHT(a.OBRNo, 5) IS NULL THEN '00001' ELSE a.OBRNo END
...
您可以使用以下命令来改变这种行为


默认情况下无法与进行比较的原因是:
NULL
表示未定义。任何东西都不等于未知,即使是
NULL
。如果与
NULL
进行比较,则结果未知,因此与
NULL
进行比较
NULL
进行比较
为NULL
/
不为NULL
,与
=NULL
进行比较

SELECT TOP 1 CASE WHEN RIGHT(a.OBRNo, 5) IS NULL THEN '00001' ELSE a.OBRNo END
...
您可以使用以下命令来改变这种行为


默认情况下无法与进行比较的原因是:
NULL
表示未定义。任何东西都不等于未知,即使是
NULL
。如果与
NULL
进行比较,结果未知,因此
NULL

查询是否返回任何行

SELECT TOP 1 CASE WHEN RIGHT(a.OBRNo, 5) IS NULL THEN '00001' ELSE a.OBRNo END
...
你的
ISNULL(x,y)
应该做你期望的事情,但是它看起来像是你的
,其中
正在过滤所有记录,因为
为null

试试这个:

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)
being
a.OBRNo NULL
NULL
因此
NULL=20
NULL
NULL,而a.ActionCode=1
NULL
当过滤被视为
FALSE
时,您的查询是否返回任何行

你的
ISNULL(x,y)
应该做你期望的事情,但是它看起来像是你的
,其中
正在过滤所有记录,因为
为null

试试这个:

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)
being
a.OBRNo NULL
将是
NULL
因此
NULL=20
将是
NULL
并且
NULL和a.ActionCode=1
将是
NULL
,当过滤被视为
FALSE
时,我想知道NULL结果如何匹配
LEN(a.OBRNo)的位置=20
a.OBRNo
不是空字符串查询不返回null-它不返回任何内容
isnull
无法在没有行的地方创建行。而且它永远不会返回任何null
a.OBRNo
值,因为您正在按
len(a.OBRNo)=20进行筛选,这对于null值来说总是错误的(即使它不会,也肯定不会是20:)。您可能想检查一下nulls在ANSI SQL中是如何工作的-正确操作非常重要。@Luaan您是对的。如果出现这种情况,如何显示默认值?让您的应用程序来处理。SQL不太适合在没有关系的地方创建关系:)这并不是说这是不可能的,但它通常比必要的要复杂得多。我想知道空结果如何匹配
where LEN(a.OBRNo)=20
a.OBRNo
不是空字符串查询不返回null-它不返回任何内容
isnull
无法在没有行的地方创建行。而且它永远不会返回任何null
a.OBRNo
值,因为您正在按
len(a.OBRNo)=20进行筛选,这对于null值来说总是错误的(即使它不会,也肯定不会是20:)。您可能想检查一下nulls在ANSI SQL中是如何工作的-正确操作非常重要。@Luaan您是对的。如果出现这种情况,如何显示默认值?让您的应用程序来处理。SQL不太适合在没有关系的地方创建关系:)这并不是说它不可能,但它通常比必要的要复杂得多。我认为问题是关于另一种情况-
ISNULL(a.OBRNo,'00001')作为ISNULL
@anatol不,这是关于OP对结果的误解-他没有结果,不是包含空值的行。正如蒂姆指出的那样,这是因为过滤器有问题。我认为问题是关于另一种情况-
ISNULL(a.OBRNo,'00001')作为ISNULL
@anatol不,这是关于OP对结果的误解-他没有得到结果,不是一行有空。正如蒂姆指出的那样,原因是过滤器有故障。