Pergunta

Ao tentar executar uma única boolean NOT operação, parece que em MS SQL Server 2005, o seguinte bloco não trabalho

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

Em vez disso, estou ficando mais sucesso com

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

No entanto, isso parece um pouco uma maneira torcida para expressar algo tão simples como uma negação.

Estou faltando alguma coisa?

Foi útil?

Solução

Use o operador ~:

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

Outras dicas

A sua solução é uma boa ... você também pode usar essa sintaxe para alternar um pouco em SQL ...

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

Subtraindo o valor de 1 parece que vai fazer o truque, mas em termos de expressar a intenção Eu acho que eu prefiro ir com:

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

É mais detalhado, mas eu acho que é um pouco mais fácil de entender.

No SQL 2005 não é um valor booleano verdadeiro, o valor do bit é outra coisa realmente.

Um bit pode ter três estados, 1, 0 e nulos (porque de dados). O SQL não converter automaticamente estes a verdadeira ou falsa (embora, gerente corporativo confusamente SQL vai)

A melhor maneira de pensar em campos de bits na lógica é como um inteiro que é 1 ou 0.

Se você usa a lógica diretamente em um campo pouco ele irá se comportar como qualquer outra variável de valor -. Ou seja, a lógica será verdadeiro se ele tem um valor (qualquer valor) e falso caso contrário

Para atribuir um bit invertido, você vai precisar usar o bit a bit operador NOT. Ao usar o bit a bit operador NOT, '~', você tem que se certificar de sua coluna ou variável é declarada como um pouco.

Isso não vai dar-lhe zero:

Select ~1 

Esta vontade:

select ~convert(bit, 1)

O mesmo acontecerá com esta:

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

BIT é um tipo de dados numéricos, não boolean. É por isso que você não pode aplicar operadores booleanos a ele.
O SQL Server não têm o tipo de dados booleano (não tenho certeza sobre o SQL Server 2008) assim que você tem que ficar com algo como solução de @ Matt Hamilton.

Use ABS para obter o valor absoluto (-1 torna-se 1) ...

DECLARE @Trend AS BIT
SET @Trend = 0
SELECT @Trend, ABS(@Trend-1)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top