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


81

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

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

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

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

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

私は何かが足りないのですか?


回答:


151

〜演算子を使用します。

DECLARE @MyBoolean bit
SET @MyBoolean = 0
SET @MyBoolean = ~@MyBoolean
SELECT @MyBoolean

11
これは、ビットではなくintを使用しているためです。
Jonas Lincoln

4
列は少しです... DBバージョンは重要ですか?
マーティン

これはSQLServer2008で機能することを知っています。私はいつもこれを行っています。質問はSQLServer 2005に関するものでしたが、そこで機能するかどうかはわかりません。
Dan VanWinkle 2011

3
訂正:MSによると、これは2005年にも機能するはずです。詳細はこちら
Dan VanWinkle 2011

3
ニースの答えは、私だけでも、SQL Serverの2000年に、それをテストし、罰金を作品
アルベルト・マルティネス

25

あなたの解決策は良いものです...この構文を使用してSQLのビットを切り替えることもできます...

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

1
参考までに、これはビット単位の排他的操作であるため機能します。多くの言語のXOR演算子と同じです。これはSET @MyBoolean = 1 - @MyBoolean、整数計算ではなくビット計算を使用することを除いて、基本的に同じです。これは適切で機能しますが、ビット数学を理解していない人にとっては混乱を招く可能性があります。詳細はこちら。@JonasLincolnのソリューションの方が優れています。
Dan VanWinkle 2011

1
参考までに、このソリューションは計算フィールドで機能しますが、caseステートメントでは機能しません。ありがとう!
誰でも2013

22

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

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

もっと冗長ですが、少しわかりやすいと思います。


10

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

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

Select ~1 

この意志:

select ~convert(bit, 1)

だからこれは:

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

9

SQL 2005には実際のブール値はなく、ビット値は実際には別のものです。

ビットには、1、0、およびnullの3つの状態を含めることができます(データであるため)。SQLはこれらを自動的にtrueまたはfalseに変換しません(ただし、紛らわしいことにSQL Enterprise Managerは変換します)

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

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


5

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


4

ABS絶対値を取得するために使用します(-1は1になります)。

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

2
-1そもそもなぜ発生するのか説明できませんでした。つまり、OPが使用したより論理的で直感的な形式で減算が表現されている場合は、そうではありません。これは、無意味に不可解で回りくどい方法です。
underscore_d
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.