1

ステータス フラグの値を交換するためのソリューション/ベスト プラクティスを探しています。

mysql のステータス INT(3) にはいくつかの値があり、そこにある他のビット単位の値を中断することなく、LIVE 値と NOT_LIVE 値を交換できるようにしたいと考えています。

0 または 1 のようなフラグ フィールドの場合は、次のように簡単です。

'status' NOT 'status'

上記のコードのように、コードロジックをあまり使わずに、2 つの値 (x、y) に基づいてスワップを行う方法があるかどうか疑問に思っていました。もちろん、私は夢を見ているかもしれません.SELECTクエリに戻り、ifステートメントとUPDATE...

何か案は?

4

3 に答える 3

1

つまり、値は1と2ですが、ビットスタイルの反転が必要ですか?1と2のビットが異なるため、これは機能しません。

これを試して:

UPDATE table SET status = CASE status WHEN 1 THEN 2 ELSE 1 END
于 2009-09-16T14:17:00.980 に答える
1

LIVE「swap[ping] the and NOT_LIVEvalues」とは正確にはどういう意味ですか? ビットが設定/設定解除されている場合LIVE、探しているのはビット単位の NAND です。たとえば、その値が 8 で、設定を解除したい場合

UPDATE table SET status = status &~ 8

値が 8 のビットを設定解除します。LIVENOT_LIVEが 2 つの異なるビットの場合、一方を設定 (OR) し、他方を設定解除 (NAND) する必要があります。ここでは、 (8)NOT_LIVEを設定しながら (4) を削除します。LIVE

UPDATE table SET status = (status &~ 4) | 8

2 つの値しか持てないstatus場合は、それらの 2 つの値を加算してから減算する必要があります。たとえば、2 つの値が 1 と 2 の場合status

UPDATE table SET status = (1 + 2) - status

もちろん、どれを書くことができますか

UPDATE table SET status = 3 - status

status他の値を取ると失敗することに注意してください。2つのうちの1つである場合にのみ変更することで、それを回避できますstatus

UPDATE table SET status = 3 - status WHERE status IN (1, 2)

この場合、statusどちらLIVEでもない場合はNOT_LIVE変更されません。

于 2009-09-16T11:26:06.113 に答える
0

ここにcaseステートメントが必要です:

UPDATE table SET status = CASE
    WHEN status = 1 THEN 2
    WHEN status = 2 THEN 3
    ELSE 1
END CASE

または、必要に応じて、 ifステートメントを使用することもできます。

UPDATE table SET status =
    IF     status = 1 THEN 2
    ELSEIF status = 2 THEN 3
    ELSE   1
END IF
于 2009-09-16T12:03:13.743 に答える