2014-01-31 52 views
2

架构和数据意外的结果SELECT CASE WHEN NULL

我有以下的架构和数据两个表:

#表1:

create table #table1(
    PK int IDENTITY(1,1) NOT NULL, 
    [TEXT] nvarchar(50) NOT NULL 
); 

PK TEXT 
1  a 
2  b 
3  c 
4  d 
5  e 

#表2:

create table #table2(
    PK int IDENTITY(1,1) NOT NULL, 
    FK int NOT NULL, 
    [TEXT] nvarchar(50) NOT NULL 
); 

PK FK TEXT 
1  2  B 
2  3  C 

问题

现在,如果我选择所有从#table1和左加入#table2这样的:

select 
    #table1.PK, 
    (case #table2.[TEXT] when NULL then #table1.[TEXT] else #table2.[TEXT] end) as [TEXT] 
from 
    #table1 
left join 
    #table2 on #table2.FK = #table1.PK 
; 

输出如下:

PK TEXT 
1  NULL 
2  B 
3  C 
4  NULL 
5  NULL 

问题

我预计结果是:

PK TEXT 
1  a  < 
2  B 
3  C 
4  d  < 
5  e  < 

那么为什么会发生这种情况(或者我做错了什么),我该如何解决这个问题?

源代码

if (OBJECT_ID('tempdb..#table1') is not null) drop table #table1; 
if (OBJECT_ID('tempdb..#table2') is not null) drop table #table2; 

create table #table1(PK int IDENTITY(1,1) NOT NULL, [TEXT] nvarchar(50) NOT NULL); 
create table #table2(PK int IDENTITY(1,1) NOT NULL, FK int NOT NULL, [TEXT] nvarchar(50) NOT NULL); 

insert into #table1 ([TEXT]) VALUES ('a'), ('b'), ('c'), ('d'), ('e'); 
insert into #table2 (FK, [TEXT]) VALUES (2, 'B'), (3, 'C'); 

select 
    #table1.PK, 
    (case #table2.[TEXT] when NULL then #table1.[TEXT] else #table2.[TEXT] end) as [TEXT] 
from 
    #table1 
left join 
    #table2 on #table2.FK = #table1.PK 
; 

drop table #table1; 
drop table #table2; 
+0

使用'CASE WHEN IS NULL' - 忘记IS。 – Mihai

+0

@Mihai感谢您的评论,但这会在关键字'IS''附近产生错误的语法错误。 –

回答

3

从我的角度来看,这是等价的

select isnull(table2.text, table1.text) as text from ... 
+0

这更清洁+1。 –

+0

你是对的,这固定了它。但是,知道我的方法失败的原因很有意思。 –

+0

@Bjørn-RogerKringsjå - 在我的回答中详细说明,问题在于您构建案例陈述的方式。当你做'CASE x WHEN THEN ...'时,你将有效地与NULL进行比较,这将永远是错误的。 – ninesided

1

您应该检查字段是否为空或不is null,即使你的case when语法正确,你应该使用其他语法正确的版本。

case 
    when #table2.[TEXT] is null then #table1.[TEXT] 
    else #table2.[TEXT] 
end 
1

问题是您构建CASE声明的方式。任何形式CASE x WHEN NULL THEN...CASE声明都不会像您最初所期望的那样行事,因为您正在有效地执行与NULL的比较,而NULL总是为false,因此总是会得到#table2.[TEXT]

我认为你需要做的:

(CASE WHEN #table2.[TEXT] IS NULL THEN #table1.[TEXT] ELSE #table2.[TEXT] END) AS [TEXT] 

这相当于COALESCE

COALESCE(#table2.[TEXT], #table1.[TEXT]) AS [TEXT]