SQL Server - BIT の反転させた値を取得する方法
BIT の反転させた(反対の)値を取得する方法
BIT のデータ型に入っている値を反転させたい時ありますよね。
例えば CloseFlag という BIT 型のカラムに、その期間がクローズされたかどうかを表す値が入っていて、クライアントのプログラムではその期間がオープンかどうかをチェックボックスで表示したいような時です。
今回はそんな時に簡単に BIT の値を反転させる方法をご紹介します。
~ (ビット演算子 NOT) を使って BIT の値を反転させる
SQL Server で、BIT の値を反転させたい時には、~ (ビット演算子 NOT) が使えます。
カラム名や変数の前に ~ をつけるだけです。
BIT 型の変数に入っている 1, 0, null を反転させてみます。
DECLARE @CloseFlag1 BIT = 1,
        @CloseFlag2 BIT = 0,
        @CloseFlag3 BIT;
SELECT	~@CloseFlag1 AS OpenFlag1,
        ~@CloseFlag2 AS OpenFlag2,
        ~@CloseFlag3 AS OpenFlag3;
 
1 と 0 の BIT の値が反転していますね。
値が NULL の時は反転させても NULL のままですので、NULL を 0 として扱いたいような時は ISNULL() などで変換する前に置き換えてください。
CASE 文を使って BIT の値を反転させる
ビット演算子のほうが簡単ですが、CASE 文を使っても、BIT の反対の値を取得することができます。
DECLARE @CloseFlag1 BIT = 1;
SELECT	CASE 
          WHEN @CloseFlag1 = 1
            THEN 0
            ELSE 1
        END AS OpenFlag1;
 
BIT の値は反転されていますね。この方法だと元の値が null の時は、反転した値が 1 になりますね。
あと、このやり方だと OpenFlag1 のデータ型は INT になります。
SQL_VARIANT_PROPERTY() を使って確認してみましょう。
SQL_VARIANT_PROPERTY() の使い方についてはこちらをご覧ください。「SQL Server: 値のデータ型を確認する方法」
DECLARE @CloseFlag1 BIT = 1;
SELECT SQL_VARIANT_PROPERTY(~@CloseFlag1, 'BaseType');
SELECT SQL_VARIANT_PROPERTY(CASE 
                              WHEN @CloseFlag1 = 1
                                THEN 0
                                ELSE 1
                            END, 'BaseType');
 
~ (ビット演算子 NOT)で反転させたほうは bit 型ですが、0, 1 と CASE 文で数字を指定しただけのときは INT 型になっていますね。
反転した値を BIT 型で取得したい時は、BIT 型に CAST してください。
DECLARE @CloseFlag1 BIT = 1;
SELECT	CASE 
          WHEN @CloseFlag1 = 1
            THEN CAST(0 AS BIT)
            ELSE CAST(1 AS BIT)
        END AS OpenFlag1;
以上、SQL Server で BIT の反転させた値を取得する方法をご紹介しました。