为什么SELECT'foo'+ NULL;在SQL Server上返回NULL

时间:2018-12-02 23:38:34

标签: sql sql-server tsql

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

更新:SQL查询是由Entity Framework Core从C#生成的,我希望可以转换空处理行为。

3 个答案:

答案 0 :(得分:3)

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

  • NULL上进行任何算术运算(两端加法,减法,乘法,除法)都会返回NULL

  • NULL的字符串连接返回NULL(在大多数RDBMS上,但在Oracle上则不然,其中NULL被视为空字符串,因此像{{1} }返回select NULL || 'A' from dual

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

有关更多信息,请查看this Wikipedia page

答案 1 :(得分:3)

通过将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;  

答案 2 :(得分:1)

NULL并不表示“ 没有”或“ ”。这是一个普遍的误解。 NULL的真正含义是“ 我不知道”。 可能是空的...但是可能还有别的东西。您只是不知道该放在哪里。

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