为什么SELECT 'foo' + NULL;
在SQL Server上返回NULL
?我希望它返回foo
。
更新:SQL查询是由Entity Framework Core从C#生成的,我希望可以转换空处理行为。
答案 0 :(得分:3)
好吧,这就是NULL
的整个概念。它指示数据库中缺少一个值,因此使大多数操作不适用:
在NULL
上进行任何算术运算(两端加法,减法,乘法,除法)都会返回NULL
。
与NULL
的字符串连接返回NULL
(在大多数RDBMS上,但在Oracle上则不然,其中NULL
被视为空字符串,因此像{{1} }返回select NULL || 'A' from dual
)
与A
(相等,不同,类似)的比较永远不会匹配。您通常需要使用诸如NULL
之类的特定功能来测试值是否为ISNULL
有关更多信息,请查看this Wikipedia page
答案 1 :(得分:3)
通过将CONCAT_NULL_YIELDS_NULL设置为 ON 或 OFF ,可以使用两种方式处理NULL串联。
PRINT 'Setting CONCAT_NULL_YIELDS_NULL ON';
GO
-- SET CONCAT_NULL_YIELDS_NULL ON and testing.
SET CONCAT_NULL_YIELDS_NULL ON;
GO
SELECT 'abc' + NULL ;
GO
--SET CONCAT_NULL_YIELDS_NULL OFF and testing.
SET CONCAT_NULL_YIELDS_NULL OFF;
GO
SELECT 'abc' + NULL;
GO
打开CONCAT_NULL_YIELDS_NULL时,将产生NULL结果,反之亦然。
如果未指定此设置,则将应用CONCAT_NULL_YIELDS_NULL数据库选项的设置。
要查看此设置的当前设置,请运行以下查询
DECLARE @CONCAT_NULL_YIELDS_NULL VARCHAR(3) = 'OFF';
IF ( (4096 & @@OPTIONS) = 4096 ) SET @CONCAT_NULL_YIELDS_NULL = 'ON';
SELECT @CONCAT_NULL_YIELDS_NULL AS CONCAT_NULL_YIELDS_NULL;
答案 2 :(得分:1)
NULL
并不表示“ 没有”或“ 空”。这是一个普遍的误解。 NULL
的真正含义是“ 我不知道”。 可能是空的...但是可能还有别的东西。您只是不知道该放在哪里。
当您将“ foo ”与“ 我不知道”结合使用时,答案仍然是“ 我不知道 ”。几乎所有数据库都以相同的方式工作。这就是SQL规范所要求的。