我写了一个类似这样的T-SQL语句(最初的看起来不同,但我想在这里给出一个简单的例子):

SELECT first_name + 
    CASE last_name WHEN null THEN 'Max' ELSE 'Peter' END AS Name
FROM dbo.person

此语句没有任何语法错误,但case-clause总是选择else部分-如果last_name为空也是如此。但是为什么呢?

我想做的是联合first_name和last_name,但如果last_name为空,整个名称变成空:

SELECT first_name +
   CASE last_name WHEN null THEN '' ELSE ' ' + last_name END AS Name 
FROM dbo.person

你知道问题出在哪里吗?


当前回答

try:

SELECT first_name + ISNULL(' '+last_name, '') AS Name FROM dbo.person

这将把空格加到姓氏上,如果它为空,整个空格+姓氏将变为null,您只得到一个名字,否则您将得到一个firts+空格+姓氏。

只要设置了空字符串连接的默认设置,这就可以工作:

SET CONCAT_NULL_YIELDS_NULL ON 

这应该不是一个问题,因为在未来的SQl Server版本中,OFF模式将会消失

其他回答

CASE WHEN last_name IS NULL THEN '' ELSE ' '+last_name END

可以使用IsNull函数

select 
    isnull(rtrim(ltrim([FirstName]))+' ','') +
    isnull(rtrim(ltrim([SecondName]))+' ','') +
    isnull(rtrim(ltrim([Surname]))+' ','') +
    isnull(rtrim(ltrim([SecondSurname])),'')
from TableDat

如果其中一列为空,则会得到一个空字符

兼容Microsoft SQL Server 2008+

WHEN部分与==进行比较,但不能真正与NULL进行比较。试一试

CASE WHEN last_name is NULL  THEN ... ELSE .. END

代替或COALESCE:

COALESCE(' '+last_name,'')

(当last_name为NULL时,'' +last_name为NULL,因此在这种情况下应该返回'')

使用SQL Server 2012以后可用的CONCAT函数。

SELECT CONCAT([FirstName], ' , ' , [LastName]) FROM YOURTABLE

给定你的查询,你也可以这样做:

SELECT first_name + ' ' + ISNULL(last_name, '') AS Name FROM dbo.person