type real mssql datatypes data bool sql sql-server tsql boolean-operations

real - sql server data type table



Boolean ''NOT'' en T-SQL no funciona en ''bit'' datatype? (7)

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

Al tratar de realizar una operación NOT booleana única, parece que en MS SQL Server 2005, el siguiente bloque no funciona

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

En cambio, estoy teniendo más éxito con

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

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

¿Me estoy perdiendo de algo?


En SQL 2005 no hay un valor booleano real, el valor del bit es algo realmente diferente.

Un bit puede tener tres estados, 1, 0 y nulo (porque son datos). SQL no los convierte automáticamente a verdadero o falso (aunque, de manera confusa, el administrador de empresa de SQL lo hará)

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

Si usa la 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.


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

Esto no te dará cero:

Select ~1

Esta voluntad:

select ~convert(bit, 1)

Entonces esto:

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


Restando el valor de 1 parece que hará el truco, pero en términos de expresar intención, creo que preferiría 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.


Su solución es buena ... también puede usar esta sintaxis para alternar un poco en SQL ...

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


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

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


Use el ~ operador:

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