web-dev-qa-db-fra.com

Le booléen «NON» dans T-SQL ne fonctionne pas sur le type de données «bit»?

En essayant d'effectuer 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.

Suis-je en train de manquer quelque chose?

72
Joannes Vermorel

Utilisez l'opérateur ~:

DECLARE @MyBoolean bit
SET @MyBoolean = 0
SET @MyBoolean = ~@MyBoolean
SELECT @MyBoolean
141
Jonas Lincoln

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;
25
Galwegian

Soustraire la valeur de 1 semble faire l'affaire, mais en termes d'expression d'intention, je pense que je préférerais aller avec:

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.

21
Matt Hamilton

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

Un bit peut avoir trois états, 1, 0 et null (car ce sont des données). SQL ne les convertit pas automatiquement en vrai ou faux (bien que, de manière confuse, le gestionnaire d'entreprise SQL le fera)

La meilleure façon de penser les champs de bits dans la logique est un entier de 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.

9
Keith

Pour affecter un bit inversé, vous devrez 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 

Cette volonté:

select ~convert(bit, 1)

Il en sera de même:

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

BIT est un type de données numérique, non booléen. C'est pourquoi vous ne pouvez pas lui appliquer d'opérateurs booléens.
SQL Server n'a pas de 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.

5
aku

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

DECLARE @Trend AS BIT
SET @Trend = 0
SELECT @Trend, ABS(@Trend-1)
4
Stephen B Craver