1

私はすでに 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_expressionreplacement_value

矛盾がある理由を知っている人はいますか。また、ケースで解決しました - より良い解決策はありますか?

4

1 に答える 1

4

ISNULLは最初の式のデータ型をCOALESCE継承し、データ型の優先順位に従ってデータ型を継承します。(varchar(1)とにかくポイントは何ですか?)

私はするだろう:

select n1.nm, 
COALESCE(CONVERT(VARCHAR(25), 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;
于 2012-09-25T17:57:01.370 に答える