SQL Server-布尔文字?


76

如何在SQL Server中写入文字布尔值?查看示例用法:

select * from SomeTable where PSEUDO_TRUE

另一个样本:

if PSEUDO_TRUE
begin
  select 'Hello, SQL!'
end 

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


1
不,只想看看true在where子句中是否有效。首先,我不知道是非。
dpp

4
SQL Server没有布尔数据类型和所需的运营商IS TRUEIS UNKNOWN等(虽然SQL-99标准提供)。常见的解决方法是使用CHAR(1)受约束的列CHECK (col1 IN ('T', 'F'))
2011年

Answers:


75

SQL Server没有布尔数据类型。正如@Mikael指出的那样,最接近的近似是位。但这是数字类型,而不是布尔类型。此外,它仅支持2个值-01(和1个非值NULL)。

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

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


7
我想知道是什么使SQL Server团队拥有位而不是布尔数据类型(值true和false)。在所有应用程序域中,布尔值都是很自然的。我相信他们仍然会使用1个字节的存储空间来存储位数据类型。即使内部存储,因为它们可能已经支持位True,并False至少在SQL脚本语法糖。
RBT

奇怪的是,因为在C语言中就是这样。没有这样的值truefalse,而是真实值(不是0)和虚假值(0)。C99添加了stdbool.h,它仅定义了这些宏,但是在后期处理中,任何这样的值都分别替换为1和0。
德拉加斯(Dragas)

39
select * from SomeTable where 1=1

1
有用!不幸的是,这不是文字,的结果1=1是布尔值true,但不是文字。
dpp

18

大多数数据库将接受此:

select * from SomeTable where true

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

select * from SomeTable where 1=1

顺便说一句,如果手动建立一个sql where子句,这是简化代码的基础,因为您可以避免必须知道要添加到where子句中的条件是否是一个条件(该条件之前应加上"WHERE"),或随后的一个(应在之前"AND")。始终以开头"WHERE 1=1",所有添加到where子句的条件(如果有)都以开头"AND"


1
An expression of non-boolean type specified in a context where a condition is expected, near 'group'我正在使用MSSQL
dpp

3
尊敬的投票者:最初回答的问题指定服务器类型“ sql-server”,因此我以“大多数数据库”的警告回答了通用问题。我看不出为什么这值得一票。
波希米亚

1
您最好先删除答案,然后再投票。不知何故我只是表示SQL不对MSSQL
dpp

2
@dpp答案现在可以接受了吗?我给了所有数据库都可以接受的替代方案
Bohemian

2
每个Microsoft SQL服务器都是一个SQL数据库服务器,但并不是每个SQL数据库服务器都是一个Microsoft SQL服务器。就像每个苹果都是一个水果,但不是每个水果都是一个苹果(或者在MS案例中,可能是一个梨:)
反向工程师

17

其他任何答案均未提及。如果您想要一个值(应该)布尔化为布尔值,则可以使用

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

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

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

woudl无法解析。您仍然需要写

IF CONVERT(bit, 0) = 0

因此它不是非常有用。


16

根据微软的说法:用于搜索的语法是

[ 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' 

8

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

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


1
如上面的答案所述,这不起作用。“在预期有条件的上下文中,在'@TRUE'附近指定的非布尔类型的表达式”
Mike Chamberlain

2
+1对我case when exists( select 1 from project.quota_group_supplier qgs with (nolock) where qgs.project_quota_id=qg.project_quota_id) then @TRUE else @FALSE end
有用

6

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

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


1
您能说明您的意思吗?它在WHERE子句中应该可以正常工作。
Matt H

1
例如select 'TRUE' where 'TRUE'。它既不能在选择上下文中有意义地使用,在哪里也不能工作。SQL解析器抱怨'TRUE'不是布尔值。同样select TRUE where TRUE在两个部分均无效。总而言之。它通常不适用于MS-SQL。
塞巴斯蒂安·马赫

1
可以,但是在比较诸如WHERE column = 'TRUE'或的值时确实可以IF @value = 'FALSE'
Matt H

5

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

哪有这回事。

您必须将值与使用进行比较= < > like ...。在SQL Server中最接近布尔值的是bit。那就是可以有值的整数null01


2

您应该考虑一个“真实值”是除0以外不仅是1的所有内容。因此,应该写1 <> 0而不是1 = 1。

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

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


1

我质疑在TSQL中使用布尔值的价值。每当我开始希望布尔值和For循环时,我就意识到自己正在像C程序员而不是SQL程序员那样处理问题。当我换档时,问题变得微不足道了。

在SQL中,您正在处理数据集。“ WHERE BOOLEAN”无效,因为它不会更改正在使用的设置。您需要将每一行与某些内容进行比较,以使filter子句生效。表/结果集一个iEnumerable,SELECT语句一个FOREACH循环。

是的,“ WHERE IsAdmin = True”比“ WHERE IsAdmin = 1”更易于阅读

是的,在动态生成TSQL时,“ WHERE True”比“ WHERE 1 = 1,...”更好。

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

但是大多数情况下,TSQL中包含的IF,WHILE和Temp表越多,则重构的可能性就越大。


1

我希望这能回答问题的意图。尽管SQL Server中没有布尔值,但是如果您的数据库具有从Access转换过来的布尔值类型,则在Access中起作用的短语是“ ... WHERE Foo”(Foo是布尔值列名)。可以将其替换为“ ... WHERE Foo <> 0” ...,并且可以使用。祝好运!


1

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

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

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


-1
select * from SomeTable where null is null

要么

select * from SomeTable where null is not null

也许这是最好的表现?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.