1

これまでケースを使用したことがなく、これを行う方法がわかりませんが、以前は使用されていなかったデータにアドレスが変更されたため、大規模な更新を行う際に問題が発生しました. if then ステートメントとして使用しようとしていますが、間違っていると確信しています。フィールドが空または null の場合、住所を更新する必要があります。

UPDATE    defendants_ALL_Fixed
SET              tiffAdd = tiffAdds.Add1, tiffZip = tiffAdds.Zip, tiffCity = tiffAdds.City, tiffState = tiffAdds.State
FROM         defendants_ALL_Fixed INNER JOIN
                      tiffAdds ON defendants_ALL_Fixed.tiff = tiffAdds.Tiff
WHERE     (defendants_ALL_Fixed.tiff = tiffAdds.Tiff)

私はそれを次のようなケースステートメントにラップしようとしました:

SELECT
  a.tiffAdd
, CASE WHEN a.tiffAdd = '' THEN

UPDATE    defendants_ALL_Fixed
SET              tiffAdd = tiffAdds.Add1, tiffZip = tiffAdds.Zip, tiffCity = tiffAdds.City, tiffState = tiffAdds.State
FROM         defendants_ALL_Fixed INNER JOIN
                      tiffAdds ON defendants_ALL_Fixed.tiff = tiffAdds.Tiff
WHERE     (defendants_ALL_Fixed.tiff = tiffAdds.Tiff)

END
FROM defendants_ALL_Fixed a

これは機能しませんでした。なぜ機能しないのかは理解していますが、ここからどこに行けばよいのかわかりません。これを月に 1 回だけ使用してデータ (約 150 万レコード) を更新し、使用するリソースは現時点ではまったく関係ありません。

ありがとう。

4

2 に答える 2

2

私があなたの質問を理解していると仮定すると(つまり、フィールドが空白の場合にのみdefendants_ALL_Fixedフィールドを更新する)、次のようにこれを行うことができます(大文字と小文字を区別する):tiffAddsdefendants_ALL_Fixed

UPDATE  defendants_ALL_Fixed
SET     tiffAdd = CASE WHEN LTRIM(RTRIM(ISNULL(tiffAdd, ''))) = '' THEN tiffAdds.Add1
                       ELSE tiffAdd
                  END ,
        tiffZip = CASE WHEN LTRIM(RTRIM(ISNULL(tiffZip, ''))) = '' THEN tiffAdds.Zip
                       ELSE tiffZip
                  END ,
        tiffCity = CASE WHEN LTRIM(RTRIM(ISNULL(tiffCity, ''))) = '' THEN tiffAdds.City
                        ELSE tiffCity
                   END ,
        tiffState = CASE WHEN LTRIM(RTRIM(ISNULL(tiffState, ''))) = '' THEN tiffAdds.State
                         ELSE tiffState
                    END
FROM    defendants_ALL_Fixed
        INNER JOIN tiffAdds ON defendants_ALL_Fixed.tiff = tiffAdds.Tiff

より単純な(またはむしろ読みやすい)オプションは、句に基づいて単純な更新ステートメントを実行することですWHERE(列ごとに1つの更新ステートメント)。

UPDATE  defendants_ALL_Fixed
SET     tiffAdd = tiffAdds.Add1
FROM    defendants_ALL_Fixed
        INNER JOIN tiffAdds ON defendants_ALL_Fixed.tiff = tiffAdds.Tiff
WHERE   ( LTRIM(RTRIM(ISNULL(tiffAdd, ''))) = '' )

編集1:コメントに基づいて、tiffAdd =''のすべての列を更新できることを示唆しますか?すなわち

UPDATE  defendants_ALL_Fixed
SET     tiffAdd = tiffAdds.Add1 ,
        tiffZip = tiffAdds.Zip ,
        tiffCity = tiffAdds.City ,
        tiffState = tiffAdds.State
FROM    defendants_ALL_Fixed
        INNER JOIN tiffAdds ON defendants_ALL_Fixed.tiff = tiffAdds.Tiff
WHERE   LTRIM(RTRIM(ISNULL(tiffAdd, ''))) = ''
于 2012-06-07T12:57:48.017 に答える
0

代わりにマージを使用しないのはなぜですか? 各フィールドごとにマージを使用し、値が null または空でないかどうかを確認します。私はそれが最善だと思います(私自身のソリューションで使用しました)。

于 2013-08-20T08:28:38.470 に答える