web-dev-qa-db-ja.com

T-SQLのブール「NOT」が「ビット」データ型で動作していませんか?

単一のブールNOT操作を実行しようとすると、MS SQL Server 2005では、次のブロックが機能しないようです。

DECLARE @MyBoolean bit;
SET @MyBoolean = 0;
SET @MyBoolean = NOT @MyBoolean;
SELECT @MyBoolean;

代わりに、私はより成功しています

DECLARE @MyBoolean bit;
SET @MyBoolean = 0;
SET @MyBoolean = 1 - @MyBoolean;
SELECT @MyBoolean;

しかし、これは否定のような単純なものを表現するための少しねじれた方法に見えます。

何か不足していますか?

72

〜演算子を使用します。

DECLARE @MyBoolean bit
SET @MyBoolean = 0
SET @MyBoolean = ~@MyBoolean
SELECT @MyBoolean
141
Jonas Lincoln

あなたのソリューションは良いものです...この構文を使用してSQLのビットを切り替えることもできます...

DECLARE @MyBoolean bit;
SET @MyBoolean = 0;
SET @MyBoolean = @MyBoolean ^ 1; 
SELECT @MyBoolean;
25
Galwegian

値を1から引くとうまくいくように見えますが、意図を表現するという点では、次のようにしたいと思います。

SET @MyBoolean = CASE @MyBoolean WHEN 0 THEN 1 ELSE 0 END

もっと冗長ですが、もう少し理解しやすいと思います。

21
Matt Hamilton

SQL 2005には本当のブール値はありません。ビット値は本当に別のものです。

ビットには、1、0、nullの3つの状態があります(データのため)。 SQLはこれらを自動的にtrueまたはfalseに変換しません(ただし、SQLエンタープライズマネージャーは混乱を招きます)

ロジックのビットフィールドを考える最良の方法は、1または0の整数として考えることです。

ビットフィールドでロジックを直接使用する場合、他の値変数と同じように動作します。つまり、値(任意の値)があればロジックはtrueになり、そうでなければfalseになります。

9
Keith

反転ビットを割り当てるには、ビットごとのNOT演算子を使用する必要があります。ビット単位のNOT演算子「〜」を使用する場合、列または変数がビットとして宣言されていることを確認する必要があります。

これはあなたにゼロを与えません:

Select ~1 

この意志:

select ~convert(bit, 1)

これも:

declare @t bit
set @t=1
select ~@t
9
FistOfFury

BITは、ブールではなく数値データ型です。それがブール演算子をそれに適用できない理由です。
SQL ServerにはBOOLEANデータ型がないため(SQL SERVER 2008について不明)、@ Matt Hamiltonのソリューションのようなものに固執する必要があります。

5
aku

ABSを使用して絶対値を取得します(-1は1になります)...

DECLARE @Trend AS BIT
SET @Trend = 0
SELECT @Trend, ABS(@Trend-1)
4