Al intentar realizar una única operación NOT booleana, 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 una forma un poco retorcida de expresar algo tan simple como una negación.
¿Me estoy perdiendo de algo?
sql
sql-server
tsql
boolean-operations
Joannes Vermorel
fuente
fuente

Respuestas:
Utilice el operador ~:
DECLARE @MyBoolean bit SET @MyBoolean = 0 SET @MyBoolean = ~@MyBoolean SELECT @MyBooleanfuente
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;fuente
SET @MyBoolean = 1 - @MyBooleanexcepto que usa matemáticas de bits en lugar de matemáticas enteras. Aunque esto es apropiado y funciona, puede resultar confuso para las personas que no entienden las matemáticas básicas. Más info aquí . La solución de @Jonas Lincoln es mejor.Restar el valor de 1 parece que funcionará, pero en términos de expresar la intención, creo que prefiero ir con:
SET @MyBoolean = CASE @MyBoolean WHEN 0 THEN 1 ELSE 0 ENDEs más detallado, pero creo que es un poco más fácil de entender.
fuente
Para asignar un bit invertido, necesitará utilizar el operador NOT a nivel de bit. Cuando utilice el operador NOT bit a bit, '~', debe asegurarse de que su columna o variable se declare como bit.
Esto no te dará cero:
Select ~1Esta voluntad:
select ~convert(bit, 1)Entonces esto:
declare @t bit set @t=1 select ~@tfuente
En SQL 2005 no hay un valor booleano real, el valor de bit es realmente algo más.
Un bit puede tener tres estados, 1, 0 y nulo (porque son datos). SQL no los convierte automáticamente en verdadero o falso (aunque, confusamente, el administrador empresarial de SQL lo hará)
La mejor forma de pensar en los campos de bits en lógica es como un número 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 falsa en caso contrario.
fuente
BIT es un tipo de datos numérico, no booleano. Es por eso que no puede aplicarle operadores booleanos.
SQL Server no tiene el tipo de datos BOOLEAN (no estoy seguro de SQL SERVER 2008) por lo que debe seguir con algo como la solución de @Matt Hamilton.
fuente
Use
ABSpara obtener el valor absoluto (-1 se convierte en 1) ...DECLARE @Trend AS BIT SET @Trend = 0 SELECT @Trend, ABS(@Trend-1)fuente
-1surgiría alguna vez en primer lugar. Es decir: no lo hará, si la resta se expresa en la forma más lógica / intuitiva que utilizó el OP. Esta es una forma inútil y críptica de hacerlo.