82 votes

SQL Server - littéral booléen ?

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

select * from SomeTable where PSEUDO_TRUE

un autre échantillon :

if PSEUDO_TRUE
begin
  select 'Hello, SQL!'
end 

Note : La requête ci-dessus n'a rien à voir avec l'utilisation que je vais en faire. C'est juste pour tester le booléen littéral.

1 votes

Non, je veux juste voir si true fonctionne dans la clause where. Tout d'abord, je ne connais pas le littéral pour true et false.

4 votes

Le serveur SQL ne possède pas de type de données booléen ni les opérateurs nécessaires. IS TRUE , IS UNKNOWN etc. (bien que la norme SQL-99 dispose des deux). Une solution de contournement courante consiste à utiliser un CHAR(1) colonne contrainte CHECK (col1 IN ('T', 'F')) .

79voto

Damien_The_Unbeliever Points 102139

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

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

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

7 votes

Je me demande ce qui a pu pousser l'équipe de SQL Server à utiliser le type de données bit au lieu du type booléen (avec les valeurs true et false). Le booléen est tellement naturel dans tous les domaines d'application. Je pense qu'ils utiliseraient toujours 1 octet de stockage pour stocker le type de données bit. Même avec le stockage interne en bit, ils auraient pu supporter True y False comme sucre syntaxique dans les scripts SQL au moins.

0 votes

C'est parce que c'est comme ça en C. Il n'y a pas de telles valeurs. true o false mais plutôt des valeurs véridiques (pas 0) et fausses (0). C99 a ajouté stdbool.h, qui ne définit que les macros pour ces valeurs, mais au post-traitement, ces valeurs sont remplacées par 1 et 0 respectivement.

43voto

nocache Points 627
select * from SomeTable where 1=1

1 votes

Il fonctionne ! Malheureusement ce n'est pas un littéral, le résultat de 1=1 est un booléen vrai mais ce n'est pas littéral.

21voto

Bohemian Points 134107

La plupart des bases de données l'acceptent :

select * from SomeTable where true

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

select * from SomeTable where 1=1

D'ailleurs, si vous construisez une clause where sql à la main, c'est la base pour simplifier votre code parce que vous pouvez éviter de devoir savoir si la condition que vous êtes sur le point d'ajouter à une clause where est le premièrement un (qui devrait être précédé de "WHERE" ), ou un ulté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 la mention "AND" .

1 votes

An expression of non-boolean type specified in a context where a condition is expected, near 'group' J'utilise MSSQL

3 votes

Cher downvoters : La question initiale à laquelle j'ai répondu no spécifier le type de serveur "sql-server", j'ai donc répondu à la question générique par une réponse générique avec l'avertissement "la plupart des bases de données". Je ne vois pas pourquoi cela mérite un downvote.

1 votes

Vous feriez mieux de supprimer votre réponse avant d'obtenir d'autres votes négatifs. D'une certaine façon, c'est de ma faute si je viens d'indiquer SQL no MSSQL .

17voto

Sam Points 466

Cela n'est pas mentionné dans les autres réponses. Si vous voulez une valeur qui orme (devrait) hydrater comme booléen, vous pouvez utiliser

CONVERT(bit, 0) -- faux CONVERT(bit, 1) -- true

Cela vous donne un bit 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

ne serait pas analysé. Vous devrez toujours écrire

IF CONVERT(bit, 0) = 0

Ce n'est donc pas très utile.

16voto

Dalex Points 2420

Selon Microsoft : la syntaxe de la 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 voir, vous toujours doivent écrire deux expressions à comparer. Ici, la condition de recherche est expression booléenne comme 1=1, a!=b

Ne confondez pas les expressions de recherche avec constantes booléennes comme Vrai. o "Faux . Vous pouvez affecter des constantes booléennes aux variables BIT.

DECLARE @B BIT
SET @B='True'

mais en TSQL vous ne pouvez pas utiliser des constantes booléennes au lieu d'expressions booléennes comme ceci :

SELECT * FROM Somewhere WHERE 'True'

Cela ne fonctionnera pas.

Mais vous pouvez utiliser des constantes booléennes pour construire une expression de recherche à double sens comme ceci :

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

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