这是在SQL中进行布尔测试的正确方法吗?


81

假设活动的是“布尔字段”(tiny int,具有0或1)

# Find all active users
select * from users where active 

# Find all inactive users
select * from users where NOT active 

换句话说,可以将“ NOT”运算符直接应用于布尔字段吗?


是的,如前所述,布尔字段通常键入“位”,而不是“ int”
戴维斯

我假设您确实喜欢漂亮的代码,因为您无疑会意识到“ active = 0”是一种可能的解决方法。在“ NOT active”和“ active = 0”之间进行选择时,我不会打扰-如果您需要对其进行解释,请添加注释。(如果将来使用该代码的人不了解true / false <-> 1/0关系,也许有人不应该触摸您的代码,顺便说一句...)
Tomas Aschan,2009年

1
@Eric:在SQL中,谓词需要产生一个布尔结果。“活动的位置”不会产生这样的结果,因为即使“活动的”是BIT数据类型-BIT不是布尔值,它也是一个范围为0.1.1的整数。因此,您必须进行某种比较以产生布尔值。“在NOT NOT(active = 1)时有效”,但在“ where NOT active”中则无效。
Tomalak

Tomalak-您应该已将该评论发布为答案!
womp

@Tomalak:“在SQL中,谓词需要产生一个布尔结果” –不太正确。SQL具有三种值逻辑,即TRUE,FALSE和UNKNOWN(考虑“ active”可以为NULL)。
2009年

Answers:


87

SQL中的布尔值是位字段。这意味着1或0。正确的语法是:

select * from users where active = 1 /* All Active Users */

要么

select * from users where active = 0 /* All Inactive Users */

14
@ JoseBasilio- PostgreSQL除外:postgresql.org/docs/9.1/static/datatype-boolean.html
Yarin

在大多数DB中,字段也可以为NULL。如果未使用活动字段的默认值配置表,则可能还需要检查NULL。
IAMNaN 2014年

在Rails(4)中使用SQLite时,它使用'f'或't'进行查询(虽然不是char)。使用上面的查询时,它不起作用。虽然:SELECT “model".* FROM “model" WHERE “boolean_column" = ‘f'工作
斯特凡·亨德里克斯

25

使用Postgres,您可以使用

select * from users where active

要么

select * from users where active = 't'

如果要使用整数值,则必须将其视为字符串。您不能使用整数值。

select * from users where active = 1   -- Does not work

select * from users where active = '1' -- Works 

环顾四周,以查找是否期望为true或TRUE或1,因此您的回答非常有帮助
jpw 2012年

4
+1有关PostgreSQL布尔选项的更多信息:postgresql.org/docs/9.1/static/datatype-boolean.html
Yarin 2014年

1
Aslo,Posgtres接受OP的语法:where activewhere not active。见postgresql.org/docs/8.2/static/functions-logical.html
卢瓦克Faugeron

13

MS SQL 2008还可以使用字符串版本的true或false。

select * from users where active = 'true'
-- or --
select * from users where active = 'false'

哇,那太酷了……我不知道该怎么用,但从我的测试中可以肯定,它在2008年以上就可以了。
Maxim Gershkovich '17

11

在SQL Server中,通常会使用。我不了解其他数据库引擎。

select * from users where active = 0

3

我个人更喜欢将char(1)与值'Y'和'N'一起用于没有布尔值本机类型的数据库。字母比数字更受用户欢迎,后者认为阅读字母的人现在将1对应为true,0对应为false。

使用(N)Hibernate时,“ Y”和“ N”也可以很好地映射。



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.