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 的 Vitals 为空,因为只有一个空字段。你如何克服这种行为?另外,这是 MS SQL Server 中的默认行为吗?

4

11 回答 11

125

尝试

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 的空白字符串)。

于 2009-06-23T23:40:45.687 回答
72

看着CONCAT_WS

例如:

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

产量

TEST STRINGTEST STRING 2

这比IFNULL围绕一切构建要容易。您可以使用空字符串作为分隔符。

于 2011-04-26T15:33:36.707 回答
12

在 mysql 中 isnull 不会工作一段时间。试试 IFNULL(),

CONCAT(IFNULL(FirstName,''),IFNULL(LastName,''),IFNULL(Email,''))
于 2011-03-25T13:55:24.183 回答
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<space>last 但只是 last 当 first 为空时,您可以这样做:

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

我在 firstname 上添加了可能为 null 的空格——这意味着该空格只有在 FirstName 有值的情况下才会存在。

将它们放在一起并在每个之间留一个空格:

RTRIM(ISNULL(Firstname+' ','') + ISNULL(LastName+' ','') + ISNULL(Email,''))
于 2009-06-24T00:26:26.530 回答
5

您始终可以使用该CONCAT_NULL_YIELDS_NULL设置..

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

于 2009-06-24T11:35:14.907 回答
4

如果你得到(就像我在 MySQL 中所做的那样):

#1582 - Incorrect parameter count in the call to native function 'ISNULL'

您可以用 COALESCE 替换 ISNULL 函数:

CONCAT(COALESCE(FirstName,''),COALESCE(LastName,''),COALESCE(Email,''))
于 2013-07-19T16:22:56.203 回答
3

斯特凡的回答是正确的。为了更深入地探讨,您需要知道 NULL 与 Nothing 不同。Null 表示没有值,或者换句话说,未定义。Nothing 代表一个空字符串,它实际上是一个值。

未定义 + 任何东西 = 未定义

坚持下去的好数据库花絮!

于 2009-06-23T23:43:43.683 回答
3

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

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

所以使用没有 IsNull 的 CONCAT 就足够了

CONCAT(FirstName, LastName, Email)
于 2016-05-05T04:23:41.833 回答
2

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

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

在 SQL Server 中,可以这样写:

SELECT FirstName + LastName + Email as Vitals FROM MEMBERS

如果需要处理NULLs:

SELECT ISNULL(FirstName, '') + ISNULL(LastName, '') + ISNULL(Email, '') as Vitals FROM MEMBERS
于 2009-06-23T23:44:02.917 回答
1

在 MS Access 的情况下

选项 1) SELECT (FirstName + " " + LastName + " " + Email) as Vitals FROM MEMBERS 如果任何字段为空,您将得到空白结果。

选项 2) SELECT (FirstName & " " & LastName & " " & Email) as Vitals FROM MEMBERS 您将使用空格代替空字段。

于 2013-11-21T01:55:49.767 回答
0

在观察了这个问题的答案之后,您可以将它们全部组合成一个简单的解决方案

CONCAT_WS(',',
IF(NULLIF(FirstName, '') IS NULL, NULL, FirstName),
IF(NULLIF(LastName, '') IS NULL, NULL, usr_lastname),
IF(NULLIF(Email, '') IS NULL, NULL, Email))

因此,简而言之,我们使用CONCAT_WS; 连接我们的字段并将它们分开,。并注意NULL字段也EMPTY不会连接

NULLIF将检查该字段是否为NULLor EMPTY,一个仅包含空格或为空的字段,例如:'', ' ') 并且输出将是NULLorNOT NULL

IF如果不是NULL或者EMPTY

于 2015-03-23T22:05:13.683 回答