SQL Server - 布尔文字?

时间:2011-08-24 05:07:28

标签: sql sql-server boolean literals

如何在SQL Server中编写文字布尔值?参见样本使用:

select * from SomeTable where PSEUDO_TRUE

另一个样本:

if PSEUDO_TRUE
begin
  select 'Hello, SQL!'
end 

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

13 个答案:

答案 0 :(得分:65)

SQL Server没有布尔值data type。正如@Mikael指出的那样,最接近的是比特。但这是一种数字类型,而不是布尔类型。此外,它仅支持2个值 - 01(以及一个非值,NULL)。

SQL(标准SQL,以及T-SQL方言)描述了Three valued logic。 SQL的布尔类型应该支持3个值 - TRUEFALSEUNKNOWN(以及非值NULL)。所以bit实际上并不是一个很好的匹配。

鉴于SQL Server不支持数据类型,我们不应该期望能够写出那种“类型”的文字。

答案 1 :(得分:34)

select * from SomeTable where 1=1

答案 2 :(得分:15)

根据Microsoft: 搜索的语法是

[ WHERE <search_condition> ]*

搜索条件是:

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

谓词是:

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

如您所见,始终必须编写两个表达式进行比较。 这里搜索条件是布尔表达式,如1 = 1,a!= b

不要将搜索表达式与'布尔常量混淆,例如'True''False'。您可以将布尔常量分配给BIT变量

DECLARE @B BIT
SET @B='True'

但是在TSQL中你不能使用布尔常量而不是像这样的布尔表达式:

SELECT * FROM Somewhere WHERE 'True'

它无效。

但您可以使用布尔常量来构建双面搜索表达式,如下所示:

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

答案 3 :(得分:14)

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

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

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

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

woudl不解析。你仍然需要写

IF CONVERT(bit, 0) = 0

所以它不是非常有用。

答案 4 :(得分:12)

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

select * from SomeTable where true

但是有些数据库(例如SQL Server,Oracle)没有布尔类型。在这些情况下,您可以使用:

select * from SomeTable where 1=1
顺便说一句,如果手动构建一个sql where子句,这是简化代码的基础,因为你可以避免知道你要添加到where子句的条件是 first < / em>一个(前面应该是"WHERE"),或者一个后续的一个(前面应该是"AND")。始终以"WHERE 1=1"开头,添加到where子句的所有条件(如果有)都以"AND"开头。

答案 5 :(得分:6)

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

一种选择是为true和false

创建自己的命名变量
DECLARE @TRUE bit
DECLARE @FALSE bit
SET @TRUE = 1
SET @FALSE = 0

select * from SomeTable where @TRUE = @TRUE

但这些只会存在于批次的范围内(您必须在每个要使用它们的批次中重新声明它们)

答案 6 :(得分:4)

  

如何在SQL Server中编写文字布尔值?
  从SomeTable中选择*,其中PSEUDO_TRUE

没有这样的事情。

您必须使用= < > like ...将值与某些内容进行比较。 SQL Server中最接近布尔值的是bit。这是一个整数,可以包含值null01

答案 7 :(得分:4)

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

  

字符串值TRUE和FALSE可以转换为位值:TRUE   转换为1,FALSE转换为0。

答案 8 :(得分:3)

您应该考虑“真实值”是除0之外的所有内容,而不仅仅是1。 因此,代替1 = 1,您应该写1&lt;&gt; 0。

因为当您使用参数(@param&lt;&gt; 0)时,您可能会遇到一些转换问题。

最知道的是Access,它将控件上的True值转换为-1而不是1。

答案 9 :(得分:1)

我质疑在TSQL中使用布尔值的价值。 每次我开始希望布尔和&对于循环,我意识到我正在接近问题,就像C程序员和&amp;不是SQL程序员。当我换档时问题变得微不足道。

在SQL中,您正在操作SET数据。 &#34;在哪里布尔&#34;是无效的,因为不会改变您正在使用的集合。您需要将每一行与某些内容进行比较,以使filter子句生效。表/结果集 是一个iEnumerable,SELECT语句 一个FOREACH循环。

是,&#34; WHERE IsAdmin = True&#34;比#34; WHERE Ismin = 1&#34;

更好阅读

是的,&#34; WHERE True&#34;比#34;哪里1 = 1,...&#34;动态生成TSQL时。

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

但大多数情况下,IF,WHILE&amp; S&amp;您在TSQL中拥有的临时表,您重构它的可能性越大。

答案 10 :(得分:1)

我希望这能回答问题的意图。虽然SQL Server中没有布尔值,但如果您的数据库具有从Access转换的布尔类型,则在Access中使用的短语是“... WHERE Foo”(Foo是布尔列名称)。它可以替换为“...... WHERE Foo&lt;&gt; 0”......这样可行。祝你好运!

答案 11 :(得分:1)

您可以使用'True'或'False'字符串来模拟布尔型数据。

Select *
From <table>
Where <columna> = 'True'

我认为这种方式可能比仅放置1慢,因为它已通过Convert_implicit函数解决。

答案 12 :(得分:-1)

select * from SomeTable where null is null

select * from SomeTable where null is not null

也许这是最佳表现?