SELECT CASE WHEN NULL时出现意外结果

时间:2014-01-31 09:17:02

标签: sql sql-server-2008 select-case

架构和数据

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

#table1的:

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

#table2中:

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;

3 个答案:

答案 0 :(得分:3)

从我的角度来看,这相当于

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

答案 1 :(得分:1)

您应该is null检查某个字段是否为空,即使您的case when在语法上是正确的,您也应该使用其他语法正确的版本。

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

答案 2 :(得分:1)

问题在于您构建CASE语句的方式。 CASE形式的任何CASE x WHEN NULL THEN...语句都不会像您最初期望的那样表现,因为您实际上是在执行与NULL的比较,这总是错误的,在您的情况下会导致{{1} }}

我认为你需要这样做:

#table2.[TEXT]

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

COALESCE