77 votes

Les booléens 'NOT' dans T-SQL ne fonctionnent pas sur le type de données 'bit'?

En essayant d’effectuer une seule opération NOT booléenne, il apparaît 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?

145voto

Jonas Lincoln Points 4330

Utilisez l'opérateur ~:

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

25voto

Galwegian Points 29966

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;
 

21voto

Matt Hamilton Points 98268

En soustrayant la valeur de 1, on dirait que cela fera l'affaire, mais pour ce qui est de l'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.

9voto

Keith Points 46288

Dans SQL 2005 il n'y a pas une réelle valeur booléenne, la valeur du bit est quelque chose d'autre vraiment.

Un bit peut avoir trois états, 1, 0 et null (parce que c'est des données). SQL n'est pas automatiquement convertir ces vrai ou faux (bien que, du point de prêter à confusion SQL enterprise manager)

La meilleure façon de penser à des champs de bits dans la logique est aussi un nombre entier de 1 ou de 0.

Si vous utilisez la logique directement sur un champ de bits il va se comporter comme n'importe quel autre variable de valeur - c'est à dire la logique est vraie si elle a une valeur (pas de valeur) et false dans le cas contraire.

5voto

aku Points 54867

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 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X