CONCAT'ing NULL字段

时间:2009-06-23 23:39:08

标签: sql mysql sql-server concatenation

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

11 个答案:

答案 0 :(得分:118)

尝试

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)。

答案 1 :(得分:67)

查看CONCAT_WS

例如:

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

产量

TEST STRINGTEST STRING 2

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

答案 2 :(得分:12)

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

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

答案 3 :(得分: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

如果你需要第一个&lt; space&gt;最后一个,但是当first第一个为null时,你可以这样做:

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

我在firstname上添加了可能为null的空格 - 这意味着只有FirstName有值时空间才会存在。

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

RTRIM(ISNULL(Firstname+' ','') + ISNULL(LastName+' ','') + ISNULL(Email,''))

答案 4 :(得分:5)

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

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

答案 5 :(得分:3)

Stefan的回答是正确的。 要进一步探测,您需要知道NULL与Nothing不同。 Null表示没有值,换句话说,没有定义。没有什么代表一个空字符串,它实际上是一个值。

Undefined + anything = undefined

坚持良好的数据库潮流!

答案 6 :(得分:3)

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

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

您可以用COALESCE替换ISNULL函数:

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

答案 7 :(得分:2)

SQL Server没有CONCAT功能 (更新:从MS SQL Server 2012 it was introduced CONCAT function开始)

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

在SQL Server中,人们会写:

SELECT FirstName + LastName + Email as Vitals FROM MEMBERS

如果您需要处理NULL s:

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

答案 8 :(得分:2)

从MS SQL Server 2012开始,它引入了CONCAT功能 和according to MSDN

  

空值隐式转换为空字符串。如果全部   如果为null,则返回varchar(1)类型的空字符串。

所以它足以使用没有IsNull的CONCAT

CONCAT(FirstName, LastName, Email)

答案 9 :(得分:1)

在MS Access的情况下

选项1)选择(FirstName +“”+ LastName +“”+电子邮件)作为成员的Vitals 如果任何字段为null,您将得到空白结果。

选项2)SELECT(FirstName&amp;“”&amp; LastName&amp;“&amp; Email”)作为成员的Vitals 您将使用null获取Space代替字段。

答案 10 :(得分: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 会检查字段是NULL还是EMPTY,这个字段只包含空格或者也是空的,例如:&#39;&#39 ;,&#39; &#39;)输出将是NULLNOT NULL

IF 如果该字段不是NULLEMPTY

,请将该字段设置为