为什么在 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 规范所要求的。