2

スキーマとデータ

次のスキーマとデータを持つ 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

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

3 に答える 3

3

私の観点からは、これは

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

問題は、CASEステートメントの作成方法です。NULLとの比較を効果的に実行しているためCASE、フォームのステートメントはCASE x WHEN NULL THEN...最初に期待したとおりに動作しません。これは常に 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]
于 2014-01-31T09:22:37.780 に答える
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 に答える