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 @MyBoolean
fuente
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 - @MyBoolean
excepto 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 END
Es 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 ~1
Esta voluntad:
select ~convert(bit, 1)
Entonces esto:
declare @t bit set @t=1 select ~@t
fuente
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
ABS
para obtener el valor absoluto (-1 se convierte en 1) ...DECLARE @Trend AS BIT SET @Trend = 0 SELECT @Trend, ABS(@Trend-1)
fuente
-1
surgirí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.