为什么 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 设置为 ON 或 OFF.[= 来处理与 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;
为什么 SELECT 'foo' + NULL;
returns NULL
在 SQL 服务器上?我希望它 return foo
.
更新:SQL 查询由 Entity Framework 核心从 C# 生成,我希望空处理行为能够被翻译。
NULL
并不意味着“无”或“空”。这是一个常见的误解。 NULL
的真正意思是“我不知道”。它 可能 是空的...但它可能是其他东西;你只是不知道该放什么。
当你将“foo”与“我不知道”组合在一起时,答案仍然是“我不知道”。几乎所有的数据库都以相同的方式工作;这是 SQL 规范的要求。
嗯,这就是 NULL
的全部概念。它表示数据库中缺少一个值,因此使大多数操作不适用:
对
NULL
进行任意算术运算(两端加减乘除)returnsNULL
.与
NULL
returnsNULL
的字符串连接(在大多数 RDBMS 上,但不是 Oracle,其中NULL
被视为空字符串,因此查询像select NULL || 'A' from dual
returnsA
)与
NULL
比较(相等、不同、相似)永远不匹配。您通常需要使用特定函数,例如ISNULL
来测试一个值是否为NULL
更多信息请查看this Wikipedia page
有两种方法可以通过将 CONCAT_NULL_YIELDS_NULL 设置为 ON 或 OFF.[= 来处理与 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;