2008-10-07 5 views
64

Tratar de realizar una sola booleano NO operación, se observa que en MS SQL Server 2005, el bloque siguiente no funciona'NOT' booleano en T-SQL que no funciona en el tipo de datos 'bit'?

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

En cambio, estoy consiguiendo más éxito con

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

embargo, esto parece un poco retorcido para expresar algo tan simple como una negación.

¿Echo de menos algo?

+0

posible duplicado de [¿Cómo voltear un poco en SQL Server?] (Http://stackoverflow.com/questions/171173/how-do-i-flip-a-bit-in-sql-server) –

Respuesta

130

Uso del operador ~:

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

Esto no funcionó. Cambió 0 a -1 y 1 a -2. – Martin

+8

Es porque estás usando un int, no un poco. –

+3

La columna es un poco ... ¿podría importar la versión de DB? – Martin

24

Su solución es una buena ... también se puede utilizar esta sintaxis para cambiar un poco en SQL ...

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

Esta solución funcionó ... gracias. – Martin

+0

Solo para un FYI, esto funciona porque es una operación exclusiva bit a bit. Igual que el operador XOR en muchos idiomas. Esto es básicamente lo mismo que hacer 'SET @MyBoolean = 1 - @ MyBoolean', excepto que está usando matemáticas de bits en lugar de matemáticas enteras. Aunque esto es apropiado y funciona, puede ser confuso para las personas que no entienden las matemáticas de bits. Más información [aquí] (http://msdn.microsoft.com/en-us/library/ms176122.aspx). @Jonas Lincoln [la solución] (http://stackoverflow.com/questions/177762/boolean-not-in-t-sql-not-working-on-bit-datatype#answer-177893) es mejor. –

+0

Como un FYI esta solución funciona para los campos calculados, mientras que una declaración de caso no. ¡Gracias! – anyeone

4

BIT es un tipo de datos numéricos, no booleano. Es por eso que no puede aplicarle operadores booleanos.
SQL Server no tiene el tipo de datos BOOLEAN (no estoy seguro acerca de SQL SERVER 2008) por lo que debe seguir con algo como la solución de @Matt Hamilton.

20

Al restar el valor de 1 parece que va a hacer el truco, pero en términos de expresar la intención Creo que prefiero ir con:

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

Es más detallado, pero creo que es un poco Más fácil de entender.

8

En SQL 2005 no es un valor booleano verdadero, el valor del bit es algo más serio.

Un bit puede tener tres estados, 1, 0 y nulo (porque son datos). SQL no convierte automáticamente estos a verdadero o falso (aunque, encargado de la empresa confusamente SQL)

La mejor manera de pensar en los campos de bits en la lógica es como un entero que es 1 ó 0.

Si utiliza lógica directamente en un campo de bit se comportará como cualquier otra variable de valor; es decir, la lógica será verdadera si tiene un valor (cualquier valor) y de lo contrario es falso.

2

Uso ABS para obtener el valor absoluto (-1 se convierte en 1) ...

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

Te perdiste de explicar por qué '-1' alguna vez surgiría en primer lugar. Es decir: no lo hará, si la resta se expresa en la forma más lógica/intuitiva que utilizó el PO. Esta es una manera inútilmente críptica y redonda de hacerlo. –

7

Para asignar un bit invertido, tendrá que utilizar el bit a bit NO operador. Cuando se utiliza el operador NOT bit a bit, '~', debe asegurarse de que su columna o variable se declare como un bit.

Esto no le dará Zero:

Select ~1 

Esto hará lo siguiente:

select ~convert(bit, 1) 

Lo mismo ocurrirá con esto:

declare @t bit 
set @t=1 
select [email protected] 
Cuestiones relacionadas