为什么在 SQL Server上SELECT 'foo' + NULL;
返回?NULL
我希望它会回来foo
。
更新:SQL 查询是由 C# 的 Entity Framework Core 生成的,我希望能翻译空处理行为。
为什么在 SQL Server上SELECT 'foo' + NULL;
返回?NULL
我希望它会回来foo
。
更新:SQL 查询是由 C# 的 Entity Framework Core 生成的,我希望能翻译空处理行为。
嗯,这就是整个概念NULL
。它表示数据库中缺少的值,因此使大多数操作不适用:
任何算术运算NULL
(两端的加法、减法、乘法、除法)都返回NULL
。
NULL
与返回的字符串连接NULL
(在大多数 RDBMS 上,但不是 Oracle,其中NULL
被视为空字符串,因此类似于select NULL || 'A' from dual
返回的查询A
)
与NULL
(相等,不同,类似)的比较永远不会匹配。您通常需要使用特定的功能,例如ISNULL
测试一个值是否NULL
有关更多信息,请查看此维基百科页面
有两种方法可以通过将 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;
NULL
并不意味着“无”或“空”。这是一个常见的误解。NULL
真正的意思是“我不知道”。它可能是空的……但它可能是别的东西;你只是不知道该放什么。
当你将“ foo ”与“我不知道”结合起来时,答案仍然是“我不知道”。几乎所有数据库都以相同的方式工作。这是 SQL 规范所要求的。