2008-10-07 9 views
64

Próbując wykonać jedną logiczną NOT pracy, wydaje się, że pod MS SQL Server 2005, kolejny blok nie działaBoolean "NOT" w T-SQL nie działa na typ danych bitowych?

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

Zamiast tego, jestem coraz bardziej skuteczne z

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

jednak jest to nieco pokrętny sposób wyrażenia czegoś tak prostego, jak negacja.

Czy brakuje mi czegoś?

+0

możliwe duplikat [Jak mogę przerzucić trochę w Serwer SQL?] (Http://stackoverflow.com/questions/171173/how-do-i-flip-a-bit-in-sql-server) –

Odpowiedz

130

użyć operatora ~:

DECLARE @MyBoolean bit 
SET @MyBoolean = 0 
SET @MyBoolean = [email protected] 
SELECT @MyBoolean 
+1

To nie działało. Zmieniło wartość 0 na -1, a 1 na -2. – Martin

+8

To dlatego, że używasz int, a nie trochę. –

+3

Kolumna jest nieco ... czy wersja DB może mieć znaczenie? – Martin

24

Twoje rozwiązanie jest dobry ... można również użyć tej składni, aby przełączać się nieco w SQL ...

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

To rozwiązanie zadziałało ... dzięki. – Martin

+0

Tylko dla FYI działa to wyłącznie dzięki bitowej operacji wyłączności. To samo, co operator XOR w wielu językach. Jest to w zasadzie takie samo, jak wykonanie 'SET @MyBoolean = 1 - @ MyBoolean', z wyjątkiem tego, że używa matematyki bitowej, a nie matematyki całkowitej. Nawet jeśli jest to właściwe i działa, może być mylące dla ludzi, którzy nie rozumieją nieco matematyki. Więcej informacji [tutaj] (http://msdn.microsoft.com/en-us/library/ms176122.aspx). @ Jonas Lincoln's [rozwiązanie] (http://stackoverflow.com/questions/177762/boolean-not-in-t-sql-not-working-on-bit-datatype#answer-177893) jest lepszy. –

+0

Jako rozwiązanie typu FYI to rozwiązanie działa dla pól obliczanych, a instrukcja case nie. Dzięki! – anyeone

4

BIT jest numeryczny typ danych, nie logiczna. Dlatego nie można do niego stosować operatorów logicznych.
SQL Server nie ma typu danych BOOLEAN (nie ma pewności co do SQL SERVER 2008), więc musisz trzymać się czegoś takiego jak rozwiązanie @Matt Hamilton.

20

odjęcie wartości od 1 Wygląda na to, że załatwi, ale jeśli chodzi o wyrażanie intencji myślę wolałbym iść z:

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

To bardziej rozwlekły, ale myślę, że to trochę łatwiejsze do zrozumienia.

8

W SQL 2005 nie jest prawdziwa wartość logiczna, wartość bitu jest naprawdę coś innego.

Bit może mieć trzy stany, 1, 0 i zero (ponieważ są to dane). SQL nie automatycznie konwertować je do prawda czy fałsz (choć łudząco SQL Manager Enterprise)

Najlepszym sposobem, aby myśleć pól bitowych w logiczny jest jako liczba całkowita, która jest 1 lub 0.

Jeśli używasz logika bezpośrednio na polu bitowym będzie zachowywać się jak każda inna zmienna wartości - tzn. logika będzie prawdą, jeśli ma wartość (dowolną wartość) i false w przeciwnym wypadku.

2

użytkowania ABS uzyskać wartość bezwzględną (-1 staje 1) ...

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

Tęskniłeś za wyjaśnieniem, dlaczego "-1" kiedykolwiek powstanie. To znaczy: nie będzie, jeśli odejmowanie jest wyrażone w bardziej logicznej/intuicyjnej formie, jaką używał OP. Jest to niepotrzebnie tajemniczy i rażący sposób na zrobienie tego. –

7

Aby przypisać odwrócony kawałek, musisz użyć operatora bitowego NOT. Używając operatora bitowego NOT, "~", upewnij się, że twoja kolumna lub zmienna jest zadeklarowana jako nieco.

nie daje zero:

Select ~1 

To będzie:

select ~convert(bit, 1) 

Więc będzie to:

declare @t bit 
set @t=1 
select [email protected] 
Powiązane problemy