T-SQL'deki Boole 'DEĞİL', 'bit' veri türü üzerinde çalışmıyor mu?


82

Tek bir boole NOT işlemi gerçekleştirmeye çalışırken, MS SQL Server 2005 altında aşağıdaki bloğun çalışmadığı anlaşılıyor

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

Bunun yerine, daha başarılı oluyorum

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

Yine de bu, olumsuzlama kadar basit bir şeyi ifade etmenin biraz çarpık bir yolu gibi görünüyor.

Bir şey mi kaçırıyorum?


Yanıtlar:


152

~ Operatörünü kullanın:

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

11
Bunun nedeni, biraz değil, int kullanıyor olmanızdır.
Jonas Lincoln

4
Sütun biraz ... DB sürümü önemli olabilir mi?
Martin

Bunun SQL Server 2008'de çalıştığını biliyorum. Bunu her zaman yapıyorum. Soru SQL Server 2005 içindi ve orada çalışıp çalışmadığından emin değilim.
Dan VanWinkle

3
Düzeltme: MS'ye göre, bu 2005 yılında da çalışmalıdır. Daha fazla bilgi burada .
Dan VanWinkle

3
Güzel cevap, az önce test ettim ve SQL Server 2000'de bile iyi çalışıyor.
Alberto Martinez

25

Çözümünüz iyi bir çözüm ... SQL'de biraz geçiş yapmak için bu sözdizimini de kullanabilirsiniz ...

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

1
Sadece bir FYI için, bu işe yarar çünkü bitsel özel işlemdir. Birçok dilde XOR operatörü ile aynı. Bu, temelde, SET @MyBoolean = 1 - @MyBooleantamsayı matematik yerine bit matematik kullanması dışında yapmakla aynıdır. Bu uygun olmasına ve işe yaramasına rağmen, biraz matematiği anlamayan insanlar için kafa karıştırıcı olabilir. Daha fazla bilgi burada . @Jonas Lincoln'ün çözümü daha iyi.
Dan VanWinkle

1
Bilginize olarak, bu çözüm hesaplanan alanlar için işe yararken bir durum ifadesi çalışmaz. Teşekkürler!
anyeone

22

Değeri 1'den çıkarmak işe yarayacak gibi görünüyor, ancak niyetin ifade edilmesi açısından şunu tercih ederim:

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

Daha ayrıntılı ama anlaşılması biraz daha kolay.


10

Tersine çevrilmiş bir bit atamak için bitsel NOT operatörünü kullanmanız gerekir. Bitsel NOT işlecini '~' kullanırken, sütununuzun veya değişkeninizin bir bit olarak bildirildiğinden emin olmalısınız.

Bu size sıfır vermez:

Select ~1 

Bu irade:

select ~convert(bit, 1)

Öyleyse bu:

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

9

SQL 2005'te gerçek bir boole değeri yoktur, bit değeri gerçekten başka bir şeydir.

Bir bit, 1, 0 ve null olmak üzere üç duruma sahip olabilir (çünkü verilerdir). SQL bunları otomatik olarak doğru veya yanlışa dönüştürmez (yine de kafa karıştırıcı bir şekilde SQL kurumsal yöneticisi olacaktır)

Mantıkta bit alanlarını düşünmenin en iyi yolu 1 veya 0 olan bir tam sayıdır.

Mantığı doğrudan bir bit alanında kullanırsanız, diğer herhangi bir değer değişkeni gibi davranacaktır - yani mantık, bir değere (herhangi bir değere) sahipse doğru, aksi takdirde yanlış olacaktır.


5

BIT, boole değil, sayısal bir veri türüdür. Bu yüzden boole operatörlerini ona uygulayamazsınız.
SQL Server'da BOOLEAN veri türü yoktur (SQL SERVER 2008 hakkında emin değilsiniz) bu nedenle @Matt Hamilton'ın çözümü gibi bir şeye bağlı kalmanız gerekir.


4

ABSMutlak değeri elde etmek için kullanın (-1, 1 olur) ...

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

2
En -1başta neden ortaya çıkacağını açıklamayı kaçırdın . Yani, çıkarma, OP'nin kullandığı daha mantıksal / sezgisel biçimde ifade edilirse olmaz. Bu, anlamsız bir şekilde şifreli ve bunu yapmanın yuvarlak yoludur.
underscore_d
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.