这似乎是一个愚蠢的问题,但是.可能是我的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本机类型映射到字符串类型.
SQLite没有布尔类型:SQLite支持哪些数据类型?
注释掉的行应该可以工作,只需在数据中使用1和0的整数值来表示布尔值.
您不需要使用任何比较运算符来比较where子句中的布尔值.
如果你的'boolean'列名为is_selectable,那么你的where子句就是:
WHERE is_selectable
SQLite没有内置的布尔类型-您必须使用整数。同样,当您将值与“ TRUE”和“ t”进行比较时,会将其与这些值作为字符串(而不是布尔值或整数)进行比较,因此比较将始终失败。
资料来源:http : //www.sqlite.org/datatype3.html