如何在SQLite的where子句中使用布尔字段?

33

这似乎是一个愚蠢的问题,但实际上并非如此。可能是我的IDE出了问题。以下是代码(从DbLinq生成):

SELECT  pics$.Caption, pics$.Id, pics$.Path, pics$.Public, pics$.Active, portpics$.PortfolioID
FROM main.Pictures pics$
inner join main.PortfolioPictures portpics$    on  pics$.Id = portpics$.PictureId

WHERE   portpics$.PortfolioId = 1 AND pics$.Id > 0
--AND pics$.Active = 1 AND pics$.Public = 1
ORDER BY pics$.Id

如果我运行此查询,会返回三行数据,其中包含名为Active和Public的两个布尔字段。添加注释行后不返回任何行。将该行更改为以下任何一种情况:
pics$.Active = 'TRUE'
pics$.Active = 't' 
pics$.Active =  boolean(1)

它不起作用。要么是错误,要么没有结果。我已经在谷歌上搜索过了,发现实际的SQL查询非常少。于是我们来到这里。

那么:如何在SQLite的where子句中使用布尔字段?

IDE是SQLite Administrator。

更新:好吧,我找到了答案。显然,SQLite Administrator会让您自己创建类型;生成的创建SQL如下:

CREATE TABLE [Pictures] ([Id] INTEGER  PRIMARY KEY AUTOINCREMENT NOT NULL,
[Path] VARCHAR(50)  UNIQUE NOT NULL,[Caption] varchAR(50)  NULL,
[Public] BOOLEAN DEFAULT '0' NOT NULL,[Active] BOOLEAN DEFAULT '1' NOT NULL)

查询的解决方法是:
AND pics$.Active = 'Y' AND pics$.Public = 'Y'

这里真正的问题是,正如第一个回答者指出的那样,在SQLite中没有布尔类型。这不是问题,但需要注意。我正在使用DbLinq生成我的数据层;也许它不应该允许映射SQLite不支持的类型。或者它应该将所有对SQLite非本地类型的映射都映射为字符串类型。

4个回答

29

您不需要使用任何比较运算符来比较where子句中的布尔值。

如果您的“布尔”列名为is_selectable,那么where子句将简单地写作: WHERE is_selectable


这个的反义词是什么?如果您正在尝试查找那些不可选的内容。 - Joshua Pinter
11
不可选择的地方。 - Avi Cherry
1
好的,但如果我希望将NULL值视为布尔假,该怎么办? - WindRider
3
WHERE COALESCE(is_selectable_maybe_null, false)在 SQLite 中,COALESCE 函数用于返回参数列表中的第一个非空表达式。在上述代码中,如果 is_selectable_maybe_null 为空,则 COALESCE 返回 false。 - Avi Cherry

23

4
一定是SQLite管理员把我搞糊涂了。在构建表时有一个布尔类型可用,但在该字段上查询总是没有结果。 - jcollum
请看我的回答,在以下链接中: https://dev59.com/WG445IYBdhLWcg3wgqnT#16880803 - Straff

5

SQLite没有内置的布尔类型 - 您必须使用整数代替。此外,当您将值与“TRUE”和“t”进行比较时,您将其作为字符串而不是布尔值或整数进行比较,因此比较将始终失败。

来源:http://www.sqlite.org/datatype3.html


-1

--> 这将返回is_online字段为False的结果

select * from device_master where is_online!=1

--> 这将返回is_online字段为True的结果

select * from device_master where is_online=1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接