私はすでに CASE ステートメントを使用してこの問題を解決しましたが、なぜ、 を使用するときにISNULL
値を check_expression に連結できるのに、replacement_value には連結できないのか疑問に思っています。次に例を示します。
create table name_test
(
nm varchar(25)
,mid_init varchar(1)
,name_type int
)
insert into name_test values('Joe',NULL,1)
insert into name_test values('Joe','X',2)
このクエリがあります。
SELECT
n1.nm, isnull(n2.mid_init+'b',n1.mid_init) as m1,
isnull(n1.mid_init,n2.mid_init+'b') as m2
FROM
name_test n1
JOIN name_test n2
on n1.nm = n2.nm and n1.name_type = 1 and n2.name_type = 2
最初のステートメント ( m1
) では、「b」で連結された NOT-NULL 値を最初に使用します。2 番目のステートメント ( m2
) では、最初に NULL 値を使用するため、クエリは replacement_value を通過する必要があります。ただし、連結された値ではなく、最初の値のみを取ります。
結果:
nm m1 m2
Joe Xb X
もう少し調査すると、次のクエリが表示されます。
select
n1.nm, isnull(n2.mid_init+'b',n1.mid_init) as m1,
isnull(n1.mid_init,'1'+ n2.mid_init+'b') as m2
from
name_test n1
join name_test n2
on n1.nm = n2.nm and n1.name_type = 1 and n2.name_type = 2
戻り値
nm m1 m2
Joe Xb 1
したがって、ISNULL
関数は全体を取得しますが、が null のcheck_expression
場合は、の最初の部分のみを取得します。check_expression
replacement_value
矛盾がある理由を知っている人はいますか。また、ケースで解決しました - より良い解決策はありますか?