架构和数据
我有两个包含以下架构和数据的表:
#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;
答案 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