28

这似乎是一个愚蠢的问题,然而。可能是我的 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 管理员。

更新:嗯,我找到了答案。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

4 回答 4

24

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

如果您的“布尔”列被命名为 is_selectable,那么您的 where 子句将是: WHERE is_selectable

于 2012-07-26T19:26:46.557 回答
22

SQLite 没有布尔类型:SQLite 支持哪些数据类型?

注释掉的行应该可以工作,只需在数据中使用整数值 1 和 0 来表示布尔值。

于 2009-02-24T06:43:03.597 回答
5

SQLite 没有内置的布尔类型——你必须使用整数来代替。此外,当您将值与 'TRUE' 和 't' 进行比较时,您会将其与这些值作为字符串进行比较,而不是作为布尔值或整数进行比较,因此比较总是会失败。

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

于 2009-02-24T06:43:29.367 回答
-2

--> 这将为您提供 is_online 字段的 False 值的结果

select * from device_master where is_online!=1

--> 这将为您提供具有 is_online 字段的 True 值的结果

select * from device_master where is_online=1

于 2017-08-09T05:36:17.570 回答