CONCAT'ing NULL字段

Tho*_*s R 59 sql sql-server concatenation

我有一个包含三个字段的表,FirstName,LastName和Email.

这是一些虚拟数据:

FirstName | LastName | Email
Adam        West       adam@west.com
Joe         Schmoe     NULL
Run Code Online (Sandbox Code Playgroud)

现在,如果我这样做:

SELECT CONCAT(FirstName, LastName, Email) as Vitals FROM MEMBERS
Run Code Online (Sandbox Code Playgroud)

Joe的Vitals为null,因为只有一个空字段.你是如何克服这种行为的?此外,这是MS SQL Server中的默认行为吗?

Ste*_*Mai 119

尝试

ISNULL(FirstName, '<BlankValue>') -- In SQL Server
IFNULL(Firstname, '<BlankValue>') -- In MySQL
Run Code Online (Sandbox Code Playgroud)

所以,

CONCAT(ISNULL(FirstName,''),ISNULL(LastName,''),ISNULL(Email,'')) -- In SQL Server
CONCAT(IFNULL(FirstName,''),IFNULL(LastName,''),IFNULL(Email,'')) -- In MySQL
Run Code Online (Sandbox Code Playgroud)

如果没有null问题会返回相同的东西(并且空字符串应为null).

  • 请参阅[BILBO答案](http://stackoverflow.com/a/5792720/532060)关于[CONCAT_WS](http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_concat -ws),在我看来是一个更好的解决方案 (9认同)
  • 这不适用于MySQL数据库... CONCAT_WS()似乎是一个更通用的解决方案. (3认同)

小智 67

看着 CONCAT_WS

例如:

CONCAT_WS('',NULL,"TEST STRING","TEST STRING 2")
Run Code Online (Sandbox Code Playgroud)

产量

TEST STRINGTEST STRING 2

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

  • [CONCAT_WS文档](http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_concat-ws) (6认同)
  • 在 MySQL 中使用它,但不知道 MS SQL Server (2认同)

cha*_*adi 12

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

CONCAT(IFNULL(FirstName,''),IFNULL(LastName,''),IFNULL(Email,''))
Run Code Online (Sandbox Code Playgroud)


Haf*_*hor 6

SELECT ISNULL(FirstName,'')+ISNULL(LastName,'')+ISNULL(Email,'') as Vitals FROM MEMBERS
Run Code Online (Sandbox Code Playgroud)

建议使用,但如果您真的迷上了CONCAT,请将其包装在{fn}中,您可以使用ODBC函数,如:

SELECT {fn CONCAT(ISNULL(FirstName,''), ISNULL(LastName,''), ISNULL(Email,''))} as Vitals FROM MEMBERS
Run Code Online (Sandbox Code Playgroud)

如果你需要第一个<space> last,但是当first first为null时,你可以这样做:

ISNULL(FirstName+' ','') + ISNULL(LastName,'')
Run Code Online (Sandbox Code Playgroud)

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

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

RTRIM(ISNULL(Firstname+' ','') + ISNULL(LastName+' ','') + ISNULL(Email,''))
Run Code Online (Sandbox Code Playgroud)


Gab*_*oli 5

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

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