CONCAT'ing NULL fields

61
我有一个带有三个字段FirstName,LastName和Email的表格。
以下是一些虚拟数据:
FirstName | LastName | Email
Adam        West       adam@west.com
Joe         Schmoe     NULL

现在,如果我执行以下操作:

SELECT CONCAT(FirstName, LastName, Email) as Vitals FROM MEMBERS

Joe的生命体征为null,因为有一个字段为null。如何克服这种行为?此外,这是否是MS SQL Server的默认行为?

11个回答

126

尝试

ISNULL(FirstName, '<BlankValue>') -- In SQL Server
IFNULL(Firstname, '<BlankValue>') -- In MySQL

所以,
CONCAT(ISNULL(FirstName,''),ISNULL(LastName,''),ISNULL(Email,'')) -- In SQL Server
CONCAT(IFNULL(FirstName,''),IFNULL(LastName,''),IFNULL(Email,'')) -- In MySQL

如果没有null的问题,它会返回相同的结果(在应该有null的地方返回空字符串)。


10
请参考BILBO的回答中关于CONCAT_WS的更好解决方案。 - Dvir Berebi
4
这在 MySQL 数据库中不起作用... CONCAT_WS() 似乎是更通用的解决方案。 - ricosrealm
1
请注意,该问题标记为SQL Server。否则,你是正确的。 - Stefan Mai

72

看看CONCAT_WS

例如:

CONCAT_WS('',NULL,"TEST STRING","TEST STRING 2")

生成

测试字符串测试字符串2

这比在所有内容周围构建IFNULL更容易。您可以使用空字符串作为分隔符。


6
CONCAT_WS 文档CONCAT_WS 函数用于将多个字符串连接成一个单独的字符串,并用指定的分隔符分隔它们。第一个参数是用作分隔符的字符串,后面跟着要连接的任意数量的字符串。如果某个字符串为 NULL,则该函数返回值也为 NULL。语法:CONCAT_WS(separator,str1,str2,...)示例:SELECT CONCAT_WS(',', 'apple', 'banana', 'orange'); -- 输出:'apple,banana,orange' SELECT CONCAT_WS('-', '2020', '03', '16'); -- 输出:'2020-03-16' - Dvir Berebi
2
在MySQL中使用它,不确定MS SQL Server行不行。 - xtds

12

在MySQL中,isNull有时不起作用。尝试使用IFNULL()。

CONCAT(IFNULL(FirstName,''),IFNULL(LastName,''),IFNULL(Email,''))

6
SELECT ISNULL(FirstName,'')+ISNULL(LastName,'')+ISNULL(Email,'') as Vitals FROM MEMBERS

推荐使用,但如果您真的喜欢CONCAT,请将其包装在{fn }中,然后您就可以像这样使用ODBC函数:

SELECT {fn CONCAT(ISNULL(FirstName,''), ISNULL(LastName,''), ISNULL(Email,''))} as Vitals FROM MEMBERS

如果你需要当first为空时仅返回last,可以这样做:

ISNULL(FirstName+' ','') + ISNULL(LastName,'')

我在名字的第一个字母后添加了空格,这个名字可能为空--这意味着如果FirstName没有值,那么空格将不会被保留。
将它们放在一起,每个之间用一个空格隔开:
RTRIM(ISNULL(Firstname+' ','') + ISNULL(LastName+' ','') + ISNULL(Email,''))

名字(FirstName)的空间不是会使其值非空吗? - Thomas R

5

您可以始终使用CONCAT_NULL_YIELDS_NULL设置。

只需运行SET CONCAT_NULL_YIELDS_NULL OFF,然后所有null连接将产生文本而不是null。


4
如果你遇到以下问题(就像我在MySQL中遇到的一样):
#1582 - Incorrect parameter count in the call to native function 'ISNULL'

您可以用COALESCE函数替换ISNULL函数:

CONCAT(COALESCE(FirstName,''),COALESCE(LastName,''),COALESCE(Email,''))

3

从 MS SQL Server 2012 开始,引入了 CONCAT 函数,并且 根据 MSDN 的说法

空值会被隐式转换为空字符串。如果所有参数都是 null,则返回一个 varchar(1) 类型的空字符串。

因此,使用 CONCAT 而不需要 IsNull 就足够了。

CONCAT(FirstName, LastName, Email)

3

Stefan的答案是正确的。 要深入探究一下,您需要知道NULL与Nothing不同。Null表示值的缺失,或者换句话说,未定义。Nothing表示一个空字符串,它实际上是一个值。

未定义 + 任何内容 = 未定义

这是一个好的数据库小贴士!


2

SQL Server没有CONCAT函数。
(更新:从MS SQL Server 2012开始,引入了CONCAT函数

在默认的SQL Server行为中,NULL会通过表达式传播。

在SQL Server中,一个人会这样写:

SELECT FirstName + LastName + Email as Vitals FROM MEMBERS

如果您需要处理空值(NULL):
SELECT ISNULL(FirstName, '') + ISNULL(LastName, '') + ISNULL(Email, '') as Vitals FROM MEMBERS

1
在MS Access的情况下:
选项1)SELECT (FirstName + " " + LastName + " " + Email) as Vitals FROM MEMBERS 如果任何字段为空,您将得到空结果。
选项2)SELECT (FirstName & " " & LastName & " " & Email) as Vitals FROM MEMBERS 如果字段为空,您将得到空格。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接