2

架构和数据

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

#表格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;
4

3 回答 3

3

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

select isnull(table2.text, table1.text) as text from ...
于 2014-01-31T09:20:06.690 回答
1

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

case
  when #table2.[TEXT] is null then #table1.[TEXT]
  else #table2.[TEXT]
end
于 2014-01-31T09:22:11.157 回答
1

问题在于您构建CASE陈述的方式。表单的任何CASE语句CASE x WHEN NULL THEN...都不会像您最初期望的那样运行,因为您正在有效地执行与 NULL 的比较,这始终是错误的,在您的情况下导致总是得到#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]
于 2014-01-31T09:22:37.780 回答