SQL Server的 – 布尔文字?

如何在SQL Server中编写文字布尔值? 看样品使用:

select * from SomeTable where PSEUDO_TRUE 

另一个样本:

 if PSEUDO_TRUE begin select 'Hello, SQL!' end 

注意:上面的查询与我将如何使用它无关。 这只是testing文字布尔值。

提前致谢!

SQL Server没有布尔数据types 。 正如@Mikael所指出的那样,最接近的就是这个位。 但是这是一个数字types,而不是一个布尔types。 另外,它只支持2个值 – 01 (和一个非值, NULL )。

SQL(标准SQL以及T-SQL方言)描述了三值逻辑 。 SQL的布尔types应该支持3个值 – TRUEFALSEUNKNOWN (以及非NULL )。 所以这里实际上并不是一个好的比赛。

鉴于SQL Server不支持数据types ,我们不应该期望能够写入这个“types”的文字。

 select * from SomeTable where 1=1 

根据微软 :search的语法是

 [ WHERE <search_condition> ]* 

而search条件是:

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

而谓词是:

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

正如你所看到的,你总是必须写两个expression式进行比较。 这里的search条件是布尔expression式,如1 = 1,a!= b

不要将searchexpression式与“True”“False”布尔常量混淆。 您可以将布尔常量分配给BITvariables

 DECLARE @B BIT SET @B='True' 

但在TSQL中,您不能使用布尔常量而不是像这样的布尔expression式:

 SELECT * FROM Somewhere WHERE 'True' 

不起作用。

但是您可以使用布尔常量来构build双向searchexpression式,如下所示:

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

这在任何其他答案中都没有提及。 如果你想要一个值,该orms(应)水合作为布尔值,你可以使用

CONVERT(bit,0) – false CONVERT(bit,1) – true

这给你一点不是布尔值。 例如,您不能在if语句中使用该值:

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

woudl不parsing。 你仍然需要写

 IF CONVERT(bit, 0) = 0 

所以它不是非常有用的。

大多数数据库会接受这个:

 select * from SomeTable where true 

如果不是,他们都会接受

 select * from SomeTable where 1=1 

在手动build立sql where子句时,这是避免必须确定谓词是否是第一个的便宜方法,在这种情况下,它需要一个WHERE或一个下一个谓词,在这种情况下,它需要一个AND 。 使用上面的内容,所有内容都以“ AND

SQL Server没有文字真或假的值。 在极less数情况下,您需要使用1=1方法(或类似方法)。

一种select是创build自己的命名variables为true和false

 DECLARE @TRUE bit DECLARE @FALSE bit SET @TRUE = 1 SET @FALSE = 0 select * from SomeTable where @TRUE = @TRUE 

但是这些只会在批处理的范围内存在(你将不得不在每个批次中重新声明它们)

如何在SQL Server中编写文字布尔值?
从SomeTable中select* PSEUDO_TRUE

哪有这回事。

您必须将值与使用= < > like ...东西进行比较。 在SQL Server中最接近你得到的是一个布尔值。 这是一个整数,可以有null01的值。

你应该考虑一个“真正的价值”是除0之外的所有东西,而不仅仅是1.因此,而不是1 = 1,你应该写1 <> 0。

因为当你使用参数(@param <> 0)时,你可能会遇到一些转换问题。

最知道的是将控制的真实值转换为-1而不是1的Access。

您可以使用值'TRUE''FALSE' 。 从https://docs.microsoft.com/en-us/sql/t-sql/data-types/bit-transact-sql

string值TRUE和FALSE可以转换为位值:TRUE转换为1,FALSE转换为0。

我质疑在TSQL中使用布尔值的价值。 每当我开始为Booleans&For循环开始时,我意识到我正在像C程序员而不是SQL程序员那样处理这个问题。 当我换挡时,问题变得微不足道了。

在SQL中,您正在操作数据集。 “哪里BOOLEAN”是无效的,因为不改变你正在使用的设置。 您需要将每行与filter子句进行比较才能生效。 Table / Resultset 一个iEnumerable,SELECT语句一个FOREACH循环。

是的,“WHERE IsAdmin = True”比“WHERE IsAdmin = 1”更好。

是的,当dynamic生成TSQL时,“WHERE True”将比“WHERE 1 = 1,…”更好。

也许,传递一个布尔值到存储过程可能会使if语句更具可读性。

但大多数情况下,如果你的TSQL中有更多的IF,WHILE和Temp表,那么你应该重构它的可能性就越大。

我希望这能回答这个问题的意图。 尽pipeSQL Server中没有布尔值,但是如果您有一个从Access转换的布尔types的数据库,那么在Access中工作的短语是“… WHERE Foo”(Foo是布尔列名称)。 它可以replace为“… WHERE Foo <> 0”…这个工作。 祝你好运!

 select * from SomeTable where null is null 

要么

 select * from SomeTable where null is not null 

也许这是最好的performance?