这似乎是一个愚蠢的问题,但是。可能是我的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本机类型映射到字符串类型。
答案 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”进行比较时,您将其与字符串进行比较,而不是作为布尔值或整数,因此比较将始终失败。
答案 3 :(得分:-1)
- >这将使您的结果具有is_online字段的虚假值
从device_master中选择*,其中is_online!= 1
- >这将使您的结果具有is_online字段的真值
从device_master中选择*,其中is_online = 1