0

私のデータ ウェアハウジング ストアド プロシージャの一部に、古いプロジェクト データを新しいプロジェクト データ (古いデータはテーブルにあり、新しいデータは一時テーブルにある) と比較し、古いデータを更新するプロシージャがあります。

奇妙な点は、古いデータが null の場合、更新ステートメントが機能しないことです。is null ステートメントを追加すると、更新は正常に機能します。私の質問は、なぜこれが思ったように機能しないのですか?

複数の更新ステートメントの 1 つ:

update cube.Projects
set prServiceLine=a.ServiceLine
from @projects1 a
    inner join cube.Projects
        on a.WPROJ_ID=cube.Projects.pk_prID
where prServiceLine<>a.ServiceLine
4

3 に答える 3

1
where prServiceLine<>a.ServiceLine

prServiceLine が null または a.ServiceLine が null の場合、条件の結果はブール値ではなく null になります

これをテストします:

declare @x int, @y int
if @x<>@y print 'works'
if @x=@y print 'works!'
set @x=1
if @x<>@y print 'not yet'
if @x=@y print 'not yet!'
set @y=2
if @x<>@y print 'maybe'
if @x=@y print 'maybe!'

出力:

maybe

「作品」、「作品!」、「まだ」、または「まだ!」は表示されません。出力を取得します。Maybe のみ (両方が等しい場合は「maybe!」)。

!=、=、または <> で null 値をテストすることはできません。テストしている値の 1 つが NULL になる可能性がある場合は、WHERE で ISNULL()、COALESCE、IS NOT NULL、または IS NULL を使用する必要があります。

于 2009-05-13T14:09:03.317 に答える
1

SQL Nullsに関するウィキペディアの記事は、実際には非常に優れています。多くの場合、true または false ではなく「unknown」を返し、動作が期待したものではないことがよくあることを説明しています。

ヌルを導入すると、かなりの数の落とし穴が関係します...

于 2009-05-13T14:31:37.650 に答える
0

おそらく、INNER JOIN ではなく LEFT JOIN (またはデータによっては RIGHT) が必要です。

于 2009-05-13T14:04:56.147 に答える