为什么 SELECT 'foo' + NULL; returns SQL 服务器上为 NULL

Why does SELECT 'foo' + NULL; returns NULL on SQL Server

为什么 SELECT 'foo' + NULL; returns NULL 在 SQL 服务器上?我希望它 return foo.

更新:SQL 查询由 Entity Framework 核心从 C# 生成,我希望空处理行为能够被翻译。

NULL 并不意味着“”或“”。这是一个常见的误解。 NULL 的真正意思是“我不知道”。它 可能 是空的...但它可能是其他东西;你只是不知道该放什么。

当你将“foo”与“我不知道”组合在一起时,答案仍然是“我不知道”。几乎所有的数据库都以相同的方式工作;这是 SQL 规范的要求。

嗯,这就是 NULL 的全部概念。它表示数据库中缺少一个值,因此使大多数操作不适用:

  • NULL进行任意算术运算(两端加减乘除)returnsNULL.

  • NULL returns NULL 的字符串连接(在大多数 RDBMS 上,但不是 Oracle,其中 NULL 被视为空字符串,因此查询像 select NULL || 'A' from dual returns A)

  • NULL比较(相等、不同、相似)永远不匹配。您通常需要使用特定函数,例如 ISNULL 来测试一个值是否为 NULL

更多信息请查看this Wikipedia page

有两种方法可以通过将 CONCAT_NULL_YIELDS_NULL 设置为 ONOFF.[= 来处理与 NULL 的连接。 12=]

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;