web-dev-qa-db-ja.com

SQL insertステートメントのビット値を反転するエレガントな方法はありますか?

私はSQL Serverでいくつかのデータを変換しています:

INSERT INTO MYTABLE (AllowEdit)
(Select PreventEdit from SOURCETABLE)

ソーステーブルのビット値を逆にする必要があります。 NOTが機能することを期待していました。これはコードで行う方法ですが、機能しません。私が考えることができる最もエレガントな方法は次のとおりです。

INSERT INTO MYTABLE (AllowEdit)
(Select ABS(PreventEdit -1) from SOURCETABLE)

もっと標準的な方法はありますか?

55
Molloch

私はこれを自分でテストしませんでしたが、 ビットごとの否定演算子~少し:

INSERT INTO MYTABLE (AllowEdit) 
(SELECT ~PreventEdit FROM SourceTable)
114
driis

NOTまたはXOR ifビット

SELECT ~PreventEdit FROM SourceTable
SELECT 1 ^ PreventEdit FROM SourceTable

SourceTableに実際に含まれていない場合は、次のようにします。

SELECT 1 - PreventEdit FROM SourceTable

編集:テスト、NOTは2の補数ではないため、ビット列で使用しないと奇妙な結果になる可能性があることに注意してください

DECLARE @bitvalue bit = 1, @intvalue int = 1;

SELECT ~@bitvalue, ~@intvalue
SELECT 1 ^ @bitvalue, 1 ^ @intvalue
SELECT 1 - @bitvalue, 1 - @intvalue

SELECT @bitvalue = 0, @intvalue = 0

SELECT ~@bitvalue, ~@intvalue
SELECT 1 ^ @bitvalue, 1 ^ @intvalue
SELECT 1 - @bitvalue, 1 - @intvalue
25
gbn