Question

Si vous essayez d'exécuter une seule opération booléenne NOT, il semble que sous MS SQL Server 2005, le bloc suivant ne fonctionne pas

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

Au lieu de cela, je réussis mieux avec

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

Pourtant, cela semble un peu tordu pour exprimer quelque chose d'aussi simple qu'une négation.

Est-ce que je manque quelque chose?

Était-ce utile?

La solution

Utilisez l'opérateur ~:

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

Autres conseils

Votre solution est bonne. Vous pouvez également utiliser cette syntaxe pour basculer un peu en SQL ...

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

Soustraire la valeur de 1, cela semble être une solution, mais en termes d’expression de l’intention, je préférerais utiliser:

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

C'est plus verbeux mais je pense que c'est un peu plus facile à comprendre.

Dans SQL 2005, il n'y a pas de vraie valeur booléenne, le bit est vraiment autre chose.

Un bit peut avoir trois états, 1, 0 et null (parce que ce sont des données). SQL ne les convertit pas automatiquement en true ou en false (bien que le gestionnaire d’entreprise SQL prête à confusion)

La meilleure façon de penser aux champs de bits dans la logique est un entier égal à 1 ou 0.

Si vous utilisez la logique directement sur un champ de bits, elle se comportera comme toute autre variable de valeur - c’est-à-dire que la logique sera vraie si elle a une valeur (n'importe quelle valeur) et fausse sinon.

Pour affecter un bit inversé, vous devez utiliser l'opérateur NOT au niveau du bit. Lorsque vous utilisez l'opérateur NOT au niveau du bit, '~', vous devez vous assurer que votre colonne ou variable est déclarée comme un bit.

Cela ne vous donnera pas zéro:

Select ~1 

Cela va:

select ~convert(bit, 1)

Ainsi va ceci:

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

BIT est un type de données numérique, pas booléen. C'est pourquoi vous ne pouvez pas y appliquer d'opérateurs booléens.
SQL Server n'a pas le type de données BOOLEAN (pas sûr de SQL SERVER 2008), vous devez donc vous en tenir à quelque chose comme la solution de @Matt Hamilton.

Utilisez ABS pour obtenir la valeur absolue (-1 devient 1) ...

DECLARE @Trend AS BIT
SET @Trend = 0
SELECT @Trend, ABS(@Trend-1)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top