-1

为什么在 SQL Server上SELECT 'foo' + NULL;返回?NULL我希望它会回来foo

更新:SQL 查询是由 C# 的 Entity Framework Core 生成的,我希望能翻译空处理行为。

4

3 回答 3

3

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

  • 任何算术运算NULL(两端的加法、减法、乘法、除法)都返回NULL

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

  • NULL(相等,不同,类似)的比较永远不会匹配。您通常需要使用特定的功能,例如ISNULL测试一个值是否NULL

有关更多信息,请查看此维基百科页面

于 2018-12-02T23:46:25.330 回答
3

有两种方法可以通过将 CONCAT_NULL_YIELDS_NULL 设置为ONOFF来处理与 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;  
于 2018-12-02T23:53:51.280 回答
1

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

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

于 2018-12-02T23:44:52.457 回答