4

1つのクエリで複数のアクションを実行することは可能ですか、それとも変更を加えるたびにクエリを実行する必要がありますか?

文字列値「BOOL」、「WORD」、または「DINT」を持つことができる列「タイプ」があります

1つのクエリで、次のことを行います。

  • すべての「BOOL」を「DIGITAL」に変更します
  • すべての「WORD」を「UINT」に変更します
  • すべての「DINT」を「LONG」に変更します

1つのクエリでこれを行うことは可能ですか(はいの場合、どのように?)

または、次のようないくつかのクエリを実行する必要がありますか?

UPDATE DB_Total SET Type = 'DIGITAL'
WHERE Type='BOOL';

前もって感謝します!

4

2 に答える 2

2

ネストされたIIFステートメントを使用できます。

UPDATE  DB_Total
SET     Type = IIF(Type='BOOL','DIGITAL',
                    IIF(Type='WORD','UINT',
                        IIF(Type='DINT','LONG',Type)
                    )
                )
WHERE   Type IN ('BOOL', 'WORD', 'DINT');

(私は通常、IIF部分をすべて1行で記述しますが、読みやすくするために改行を行いました)

于 2013-02-14T13:03:48.433 に答える
2

Switch()ネストされた式の代わりとして考えてくださいIIf()

このデータでDB_Total...

id Type
 1 BOOL
 2 abc
 3        <-- Type is Null
 4 WORD
 5 DINT

...このクエリは次のように更新DB_Totalされます...

UPDATE DB_Total
SET [Type] = Switch(
    [Type]='BOOL','DIGITAL',
    [Type]='WORD','UINT',
    [Type]='DINT','LONG'
    )
WHERE [Type] IN ('BOOL', 'WORD', 'DINT');

DB_Total後:

id Type
 1 DIGITAL
 2 abc
 3 
 4 UINT
 5 LONG

ただし、別のアプローチの方が便利な場合があります。replacementsテーブルを作成します。

id old_type new_type
 1 BOOL     DIGITAL
 2 WORD     UINT
 3 DINT     LONG

次に、このステートメントはバージョンUPDATEと同じ変更を生成します。DB_TotalSwitch()

UPDATE DB_Total AS d
INNER JOIN replacements AS r
ON d.Type = r.old_type
SET d.Type = [r].[new_type];

将来、単語置換のペアを変更または追加/削除する必要がある場合は、replacementsテーブルを編集するだけで済みます。その場合、クエリを修正する必要はありません。

于 2013-02-14T17:24:26.273 に答える