CONCAT'ing NULL字段

我有一个表有三个字段,名字,姓氏和电子邮件。

以下是一些虚拟数据:

FirstName | LastName | Email Adam West adam@west.com Joe Schmoe NULL 

现在,如果我这样做:

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

乔的重要性是空的,因为有一个空字段。 你如何克服这种行为? 另外,这是MS SQL Server中的默认行为吗?

尝试

 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问题(和一个空string应该是null)。

看看CONCAT_WS

例如:

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

产量

TEST STRINGTEST STRING 2

这比在任何地方构buildIFNULL容易。 您可以使用空string作为分隔符。

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

 CONCAT(IFNULL(FirstName,''),IFNULL(LastName,''),IFNULL(Email,'')) 
 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 

如果你需要第一个<空格>最后一个,但只是最后一个空时,你可以这样做:

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

我在第一个名字上加了一个空格 – 这可能意味着这个空格只会在FirstName有一个值时才能存在。

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

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

您始终可以使用CONCAT_NULL_YIELDS_NULL设置

只需运行SET CONCAT_NULL_YIELDS_NULL OFF ,然后所有的null连接将导致文本,而不是空的..

斯蒂芬的回答是正确的。 为了深入探究,你需要知道NULL和Nothing不一样。 空值表示没有值,或换句话说,没有定义。 没有什么东西代表一个空string,它实际上是一个值。

未定义的东西=未定义

良好的数据库珍闻坚持!

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

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

您可以用COALESCEreplaceISNULL函数:

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

SQL Server没有CONCATfunction。
(更新:从MS SQL Server 2012开始, 它引入了CONCATfunction )

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

在SQL Server中,可以这样写:

 SELECT FirstName + LastName + Email as Vitals FROM MEMBERS 

如果你需要处理NULL s:

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

在MS Access的情况下

选项1)select(名字+“”+姓氏+“”+电子邮件)作为Vitals从成员您将得到空白结果在任何字段与空的情况下。

选项2)SELECT(名字&“”&姓氏&“”&电子邮件)作为Vitals从成员您将获得空间代替字段与空。

从MS SQL Server 2012开始,它引入了CONCATfunction,并根据MSDN

空值被隐式转换为空string。 如果所有参数都为空,则返回一个types为varchar(1)的空string。

所以在没有IsNull的情况下使用CONCAT就足够了

 CONCAT(FirstName, LastName, Email) 

在观察这个问题的答案之后,你可以把它们全部合并成一个简单的解决scheme

 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 ,一个只包含空格的字段,或者也是空的,例如:'',''),输出将是NULLNOT NULL

IF如果不是NULLEMPTY那么将输出字段