web-dev-qa-db-fra.com

SQL Server - littéral booléen?

Comment écrire une valeur booléenne littérale dans SQL Server? Voir exemple d'utilisation:

select * from SomeTable where PSEUDO_TRUE

un autre échantillon:

if PSEUDO_TRUE
begin
  select 'Hello, SQL!'
end 

Remarque: la requête ci-dessus n'a rien à voir avec la façon dont je vais l'utiliser. C'est juste pour tester le booléen littéral.

68
dpp

SQL Server n'a pas de booléen type de données . Comme @Mikael l'a indiqué, l'approximation la plus proche est le bit. Mais c'est un type numérique, pas un type booléen. De plus, il ne supporte que 2 valeurs - 0 ou 1 (et une non-valeur, NULL).

SQL (SQL standard, ainsi que le dialecte T-SQL) décrit un logique à trois valeurs . Le type booléen pour SQL devrait prendre en charge 3 valeurs - TRUE, FALSE et UNKNOWN (ainsi que la non-valeur NULL). Donc, bit n'est pas vraiment un bon match ici.

Étant donné que SQL Server ne prend pas en charge le type de données , nous ne devrions pas nous attendre à pouvoir écrire des littéraux de ce "type".

67
select * from SomeTable where 1=1
36
nocache

Selon Microsoft : la syntaxe de recherche est

[ WHERE <search_condition> ]*

Et la condition de recherche est:

<search_condition> ::= 
    { [ NOT ] <predicate> | ( <search_condition> ) } 
    [ { AND | OR } [ NOT ] { <predicate> | ( <search_condition> ) } ] 
[ ,...n ] 

Et le prédicat est:

<predicate> ::= 
    { expression { = | < > | ! = | > | > = | ! > | < | < = | ! < } expression 

Comme vous pouvez le constater, vous devez toujours écrire deux expressions à comparer. Ici la condition de recherche est une expression booléenne comme 1 = 1, a! = B

Ne confondez pas les expressions de recherche avec des constantes booléennes telles que 'True' ou 'Faux' . Vous pouvez affecter des constantes booléennes à des variables BIT

DECLARE @B BIT
SET @B='True'

mais dans TSQL, vous ne pouvez pas utiliser de constantes booléennes à la place d'expressions booléennes telles que:

SELECT * FROM Somewhere WHERE 'True'

Ça ne marchera pas.

Mais vous pouvez utiliser des constantes booléennes pour créer une expression de recherche bilatérale comme celle-ci:

SEARCH * FROM Somewhere WHERE 'True'='True' 
15
Dalex

Ce n'est mentionné dans aucune des autres réponses. Si vous voulez une valeur qui orms (devrait) s'hydrater comme booléen, vous pouvez utiliser

CONVERT (bit, 0) - false CONVERT (bit, 1) - vrai

Cela vous donne un peu qui n'est pas un booléen. Vous ne pouvez pas utiliser cette valeur dans une instruction if, par exemple:

IF CONVERT(bit, 0)
BEGIN
    print 'Yay'
END

woudl pas analyser. Vous auriez encore besoin d'écrire

IF CONVERT(bit, 0) = 0

Donc, ce n'est pas terriblement utile.

15
Sam

La plupart des bases de données accepteront ceci:

select * from SomeTable where true

Cependant, certaines bases de données (SQL Server, Oracle, par exemple) n'ont pas de type booléen. Dans ces cas, vous pouvez utiliser:

select * from SomeTable where 1=1

BTW, si vous construisez une clause where à la main, c’est la base pour simplifier votre code car vous pouvez éviter de savoir si la condition que vous êtes sur le point d’ajouter à une clause where est le premier un (qui devrait être précédé de "WHERE") ou un ltérieur un (qui devrait être précédé de "AND"). En commençant toujours par "WHERE 1=1", toutes les conditions (le cas échéant) ajoutées à la clause where sont précédées de "AND".

14
Bohemian

SQL Server n'a pas de valeur true ou false littérale. Vous aurez besoin d'utiliser le 1=1 méthode (ou similaire) dans les rares cas où cela est nécessaire.

Une option consiste à créer vos propres variables nommées pour true et false

DECLARE @TRUE bit
DECLARE @FALSE bit
SET @TRUE = 1
SET @FALSE = 0

select * from SomeTable where @TRUE = @TRUE

Mais ceux-ci n'existeront que dans le cadre du lot (vous devrez les redéclarer dans chaque lot dans lequel vous souhaitez les utiliser)

6
Daniel Renshaw

Vous pouvez utiliser les valeurs 'TRUE' et 'FALSE'. De https://docs.Microsoft.com/en-us/sql/t-sql/data-types/bit-transact-sql :

Les valeurs de chaîne TRUE et FALSE peuvent être converties en valeurs de bits: TRUE est converti en 1 et FALSE en 0.

4
Matt H

Comment écrire une valeur booléenne littérale dans SQL Server?
select * from SomeTable où PSEUDO_TRUE

Il n'y a pas une telle chose.

Vous devez comparer la valeur avec quelque chose utilisant = < > like .... Le plus proche que vous obtenez une valeur booléenne dans SQL Server est le bit . Et c’est un entier pouvant avoir les valeurs null, 0 et 1.

4
Mikael Eriksson

Vous devriez considérer qu'une "valeur vraie" est tout sauf 0 et pas seulement 1. Ainsi, au lieu de 1 = 1, vous devriez écrire 1 <> 0.

Parce que lorsque vous utiliserez le paramètre (@param <> 0), vous pourriez avoir un problème de conversion.

Le plus connu est Access, qui traduit la valeur vraie du contrôle en -1 au lieu de 1.

2
Marco Guignard

Je m'interroge sur l'intérêt d'utiliser un booléen dans TSQL. Chaque fois que j'ai commencé à souhaiter des boucles Booleans & For, j'ai réalisé que j'abordais le problème comme un programmeur C et non un programmeur SQL. Le problème est devenu trivial quand j'ai changé de sujet.

En SQL, vous manipulez des SET de données. "WHERE BOOLEAN" est inefficace, car il ne modifie pas l’ensemble avec lequel vous travaillez. Vous devez comparer chaque ligne à quelque chose pour que la clause filter soit efficace. La table/l'ensemble de résultats est un iEnumerable, l'instruction SELECT est une boucle FOREACH.

Oui, "WHERE IsAdmin = True" est plus agréable à lire que "WHERE IsAdmin = 1"

Oui, "WHERE True" serait plus intéressant que "WHERE 1 = 1, ..." lors de la génération dynamique de TSQL.

et peut-être que passer un booléen à un proc stocké peut rendre une instruction if plus lisible.

Mais surtout, plus il y a de tables IF, WHILE & Temp dans votre TSQL, plus vous devriez la refactoriser.

1
David Lean

J'espère que cela répond à l'intention de la question. Bien qu'il n'y ait pas de booléens dans SQL Server, si vous avez une base de données contenant des types booléens traduits à partir d'Access, la phrase qui fonctionne dans Access était "... WHERE Foo" (Foo est le nom de la colonne booléenne). Il peut être remplacé par "... WHERE Foo <> 0" ... et cela fonctionne. Bonne chance!

1
den232