Pregunta

Al intentar realizar una única operación booleana NOT, 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 torcido para expresar algo tan simple como una negación.

¿Me estoy perdiendo algo?

¿Fue útil?

Solución

Utilice el operador ~:

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

Otros consejos

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;

Restar el valor de 1 parece que funcionará, pero en términos de expresar la 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.

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

Un bit puede tener tres estados, 1, 0 y nulo (porque son datos). SQL no los convierte automáticamente a verdadero o falso (aunque, confusamente, el administrador empresarial 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 bits, 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 falsa.

Para asignar un bit invertido, deberá usar el operador NOT a nivel de bit. Al utilizar el operador NO a nivel de bit, '~', debe asegurarse de que su columna o variable se declare como un bit.

Esto no te dará cero:

Select ~1 

Esto hará que:

select ~convert(bit, 1)

También lo hará esto:

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

BIT es un tipo de datos numérico, no booleano. Por eso no puedes aplicarle operadores booleanos.
SQL Server no tiene el tipo de datos BOOLEAN (no estoy seguro acerca del SERVIDOR SQL 2008), por lo que debe atenerse a algo como la solución de @Matt Hamilton.

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

DECLARE @Trend AS BIT
SET @Trend = 0
SELECT @Trend, ABS(@Trend-1)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top