首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >T-SQL CASE子句:如何指定WHEN NULL

T-SQL CASE子句:如何指定WHEN NULL
EN

Stack Overflow用户
提问于 2010-07-13 21:32:04
回答 14查看 530.2K关注 0票数 240

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

代码语言:javascript
复制
SELECT first_name + 
    CASE last_name WHEN null THEN 'Max' ELSE 'Peter' END AS Name
FROM dbo.person

该语句没有任何语法错误,但如果last_name为null,则case子句始终选择ELSE-part。但是为什么呢?

我想要做的是统一first_name和last_name,但是如果last_name为null,那么整个名称就变成null:

代码语言:javascript
复制
SELECT first_name +
   CASE last_name WHEN null THEN '' ELSE ' ' + last_name END AS Name 
FROM dbo.person

你知道问题出在哪里吗?

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2010-07-13 21:34:31

代码语言:javascript
复制
CASE WHEN last_name IS NULL THEN '' ELSE ' '+last_name END
票数 393
EN

Stack Overflow用户

发布于 2010-07-13 21:36:57

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

代码语言:javascript
复制
CASE WHEN last_name is NULL  THEN ... ELSE .. END

相反,或者合并:

代码语言:javascript
复制
COALESCE(' '+last_name,'')

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

票数 45
EN

Stack Overflow用户

发布于 2010-07-14 15:09:28

有很多解决方案,但没有一个解决方案涵盖了原始语句不起作用的原因。

代码语言:javascript
复制
CASE last_name WHEN null THEN '' ELSE ' '+last_name

在when之后,会检查是否相等,这应该是真或假。

如果比较的一个部分或两个部分为空,则比较的结果将是未知的,这在case结构中被视为false。请参阅:https://www.xaprb.com/blog/2006/05/18/why-null-never-compares-false-to-anything-in-sql/

为了避免这种情况,Coalesce是最好的方法。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3237646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档