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