【问题标题】:Why does SELECT 'foo' + NULL; returns NULL on SQL Server为什么 SELECT 'foo' + NULL;在 SQL Server 上返回 NULL
【发布时间】:2018-12-02 23:38:34
【问题描述】:

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

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

【问题讨论】:

  • 你的期望是错误的。几乎所有使用NULL 的操作都会返回NULL,包括字符串连接。
  • NULL 和空字符串 (’’) 是两个不同的东西。
  • 从技术上讲,如果您想这样做,您可以预先将CONCAT_NULL_YIELDS_NULL 设置为关闭。但它是有原因的,所以......(这个功能也会在某个时候被删除,所以最好不要使用它。)
  • 或者使用CONCAT函数。它忽略了 NULL 的
  • @LukStorms 代码由 EF Core ORM 生成,来自 C#

标签: sql sql-server string tsql sql-null


【解决方案1】:

有两种方法可以通过将 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;  
【解决方案2】:

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

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

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

  • NULL(相等、不同、喜欢)的比较永远不会匹配。通常需要使用ISNULL等特定函数来测试一个值是否为NULL

更多信息请查看this Wikipedia page

【讨论】:

  • 我完全理解在逻辑和数值的情况下所描述的 null 处理背后的原因,大多数编程语言都以相同的方式处理 null,但我对 string+ 运算符感到惊讶。跨度>
  • 是的@mobal,我同意这很棘手。请注意,Oracle RDBMS 的工作方式不同,并且在字符串连接上下文中使用时,很乐意将NULL 视为空字符串。用这些信息更新了我的答案。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 2022-12-26
    • 1970-01-01
    • 2018-12-10
    相关资源
    最近更新 更多