来自MSDN文档:
当SET CONCAT_NULL_YIELDS_NULL为ON时,将空值与字符串连接会产生NULL结果。例如,SELECT'abc'+ NULL产生NULL。当SET CONCAT_NULL_YIELDS_NULL为OFF时,将空值与字符串连接将产生字符串本身(空值被视为空字符串)。例如,SELECT'abc'+ NULL产生abc。
这种行为的目的是什么?将它作为默认设置有什么用处?我知道可以通过更改设置或使用COALESCE
等方法来规避它,但我不明白为什么这是标准设置。
答案 0 :(得分:6)
将null
视为含义"未知"。如果将未知值与已知值连接,则结果仍然是未知值。
这是考虑ANSI合规性的null
的标准方法。有关此问题的更多证据,请参阅https://en.wikipedia.org/wiki/Null_(SQL)
它声明:
SQL null是状态(未知)而不是值。这种用法与大多数编程语言完全不同,其中null表示未分配给特定实例。
答案 1 :(得分:2)
CONCAT_NULL_YIELDS_NULL
是deprecated。
在SQL Server
CONCAT_NULL_YIELDS_NULL
的未来版本中将始终如此 打开,任何明确将选项设置为OFF的应用程序将 生成错误。避免在新的开发工作中使用此功能, 并计划修改当前使用此功能的应用程序。
关于您的问题,这是per the SQL Standard
核心功能ID E021-07:使用
||
连接两个字符串 运营商:string1 || string2
如果至少有一个操作数为
NULL
,则结果为NULL
。
虽然SQL Server不使用标准||
运算符。
在SQL空格中的大多数操作中,虽然存在一些不一致性,但仍会传播
NULL + 3
返回NULL
但
SELECT SUM(N)
FROM (VALUES (NULL),
(3)) V(N)
返回3
以及忽略空值的信息性消息。
如果您至少使用SQL Server 2012,则可以使用CONCAT
- 这会将NULL视为空字符串,就像您想要的那样。