2017-11-29 4 views
1

残っている場合はテーブル1から行を返そうとしていますelseこのようなすべての列に対して左の結合のテーブル値を戻しています左側の結合のいずれかのテーブルからすべての列を返します

select 
(case when u2.Id is null then u1.Name else u2.Name end) as Name, 
(case when u2.Id is null then u1.Department else u2.Department end) as Department, 
(case when u2.Id is null then u1.Office else u2.Office end) as Office 
from user u1 
left join user u2 on u1.TerminationDate = u2.TerminationDate 

これは実用的な解決策ですが、私はこの例ではいくつかの列しか含んでいないので、たくさんの列があり、そこにあるはずですこれを達成するためのよりよいアプローチ。 coalesce()またはisnull()を使用して

+4

[NAME'として '合体(u2.Name、u1.Name)](https://docs.microsoft.com/en-us/sql/t-sql/language-elements/coalesce-transact-sql) – SqlZim

+0

@SqlZim - ありがとうございます!!! –

+2

代わりに(SQL Serverの非ansi構文):['Name = isnull(u2.Name、u1.Name)'](https://docs.microsoft.com/en-us/sql/t-sql/functions/isnull-transact-sql) – SqlZim

答えて

0

coalesce()はansi(標準)sqlであり、2つ以上のパラメータをサポートしています。isnull()はSQL Server固有であり、2つのパラメータのみをサポートします。 There are other differences as well

select 
    coalesce(u2.Name, u1.Name) as Name 
    , ... 

代わりに(SQL Serverの非ANSI構文):

select 
    Name = isnull(u2.Name, u1.Name) 
    , ... 
0

使用COALESCE

select 
coalesce(u2.Name, u1.Name) as Name, 
coalesce(u2.Id, u1.Department) as Department, 
coalesce(u2.Id, u1.Office) as Office, 
from user u1 
left join user u2 on u1.TerminationDate = u2.TerminationDate 
関連する問題