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

时间:2009-02-24 06:24:26

标签: sqlite dblinq

这似乎是一个愚蠢的问题,但是。可能是我的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)

它不起作用。错误或没有结果。我已经google了这一点,发现实际的SQL查询缺乏。我们在这里。

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

IDE是SQLite管理员。

更新:嗯,我找到了答案。 SQLite管理员可以让你显然构成自己的类型;生成的create 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 个答案:

答案 0 :(得分:18)

SQLite没有布尔类型:What datatypes does SQLite support?

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

答案 1 :(得分:13)

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

如果你的'boolean'列被命名为is_selectable,那么你的where子句就是: WHERE is_selectable

答案 2 :(得分:4)

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

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

答案 3 :(得分:-1)

- >这将使您的结果具有is_online字段的虚假值

从device_master中选择*,其中is_online!= 1

- >这将使您的结果具有is_online字段的真值

从device_master中选择*,其中is_online = 1