3

私はMERGE2つのテーブルの間で実行しています

MERGE indexdecomp.Constituent targ
USING (SELECT ic.ConstituentName           
       FROM   indexdecomp.IndexConstituents ic) src
ON (((targ.Name = src.ConstituentName) OR (targ.Name IS NULL AND src.ConstituentName IS NULL)))
WHEN NOT MATCHED BY TARGET THEN 
UPDATE SET
    targ.Name = src.ConstituentName
;

そして私のON節には次の述語があります:

(targ.Name = src.ConstituentName) OR (targ.Name IS NULL AND src.ConstituentName IS NULL)

両方の名前が等しい場合、または両方の名前が `nullの場合、一致すると見なしているため、この述語があります。

null2つの列間の等式を処理するためのより良いまたはより従来の方法はありますか?どのようにして最速の実行を生み出すでしょうか?

4

2 に答える 2

3

次のようなことができます: ( SQL ref )

SET ANSI_NULLS OFF;

MERGE indexdecomp.Constituent targ
USING (SELECT ic.ConstituentName           
   FROM #IndexConstituents ic) src
ON (((targ.Name = src.ConstituentName)))
WHEN NOT MATCHED BY TARGET THEN 
UPDATE SET
    targ.Name = src.ConstituentName;

SET ANSI_NULLS ON;

しかし、それは述語をひとまとめにするためのかなり重いトレードオフのようであり、どちらもあまり読みやすいものではありません。実際には、2 つの文字列引数を取り、ブール値を返す UDF を使用して、この混乱を抽象化できます。

何かのようなもの:

create function StrNullCompare(@a varchar(max), @b varchar(max))
returns int
as
begin
    if ((@a = @b) or (@a is null and @b is null)) return 1;

    return 0;
end

-- tests
select dbo.StrNullCompare('wer', 'were');
select dbo.StrNullCompare('wer', 'wer');
select dbo.StrNullCompare('hi', null);
select dbo.StrNullCompare(null, null);

そして、述語は次のようになります。

(dbo.StrNullCompare(targ.Name, src.ConstituentName)=1)
于 2012-12-06T19:20:01.657 に答える
2

あなたは試すことができます..

ISNULL (targ. Name,'a magic string value') =ISNULL (src.ConstituentName,'a magic string value') 

もちろん、必要に応じて独自のマジック ストリングを追加します。たとえば、newid () を使用して GUID を取得し、それを使用します。

これが and or よりも「優れている」かどうかはよくわかりませんが、もう少し人間が読めます。ただし、両方のアプローチをベンチマークしてテストする価値があります。

于 2012-12-06T19:39:42.220 に答える