我写了一个类似这样的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

你知道问题出在哪里吗?


当前回答

我试着转换到一个字符串,并测试一个零长度的字符串,它工作。

CASE 
   WHEN LEN(CAST(field_value AS VARCHAR(MAX))) = 0 THEN 
       DO THIS
END AS field 

其他回答

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

我找到了解决办法。只ISNULL CASE语句:

ISNULL(CASE x WHEN x THEN x ELSE x END, '') AS 'BLAH'

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

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

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

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

Jason发现了一个错误,所以这可以工作…

有人能确认其他平台的版本吗? SQL服务器:

SELECT
CASE LEN(ISNULL(last_name,'')) 
WHEN 0 THEN '' 
ELSE ' ' + last_name
END AS newlastName

MySQL:

SELECT
CASE LENGTH(IFNULL(last_name,'')) 
WHEN 0 THEN '' 
ELSE ' ' + last_name
END AS newlastName

Oracle:

SELECT
CASE LENGTH(NVL(last_name,'')) 
WHEN 0 THEN '' 
ELSE ' ' + last_name
END AS newlastName