Domanda

Tentando di eseguire una singola operazione NON booleana, sembra che in MS SQL Server 2005 il seguente blocco non funzioni

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

Invece, sto ottenendo più successo con

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

Tuttavia, questo sembra un po 'contorto per esprimere qualcosa di semplice come una negazione.

Mi manca qualcosa?

È stato utile?

Soluzione

Utilizza l'operatore ~:

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

Altri suggerimenti

La tua soluzione è buona ... puoi anche usare questa sintassi per alternare un po 'in SQL ...

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

Sottraendo il valore da 1 sembra che farà il trucco, ma in termini di espressione dell'intento penso che preferirei andare con:

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

È più dettagliato ma penso che sia un po 'più facile da capire.

In SQL 2005 non esiste un valore booleano reale, il valore bit è davvero qualcos'altro.

Un bit può avere tre stati, 1, 0 e null (perché sono dati). SQL non li converte automaticamente in vero o falso (anche se, confusamente, lo farà il responsabile aziendale di SQL)

Il modo migliore di pensare ai campi di bit in logica è come un numero intero che sia 1 o 0.

Se si utilizza la logica direttamente su un campo di bit, si comporterà come qualsiasi altra variabile di valore, ovvero la logica sarà vera se ha un valore (qualsiasi valore) e falso altrimenti.

Per assegnare un bit invertito, è necessario utilizzare l'operatore NOT bit a bit. Quando si utilizza l'operatore NOT bit a bit, '~', è necessario assicurarsi che la colonna o la variabile sia dichiarata come un bit.

Questo non ti darà zero:

Select ~1 

Questo:

select ~convert(bit, 1)

Così sarà:

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

BIT è un tipo di dati numerico, non booleano. Ecco perché non puoi applicare ad esso operatori booleani.
SQL Server non ha un tipo di dati BOOLEAN (non sono sicuro di SQL SERVER 2008), quindi è necessario attenersi a qualcosa come la soluzione di @Matt Hamilton.

Usa ABS per ottenere il valore assoluto (-1 diventa 1) ...

DECLARE @Trend AS BIT
SET @Trend = 0
SELECT @Trend, ABS(@Trend-1)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top