2009-02-24 39 views
21

Dường như đó là một câu hỏi ngớ ngẩn. Nó có thể là IDE của tôi, điều đó làm tôi thất vọng. Dưới đây là đoạn code (điều này được tạo ra từ DbLinq):Làm cách nào để sử dụng trường boolean trong mệnh đề where trong SQLite?

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 

Nếu tôi chạy truy vấn này tôi nhận được ba hàng trở lại, với hai lĩnh vực boolean được gọi là Active và Công. Việc thêm vào dòng nhận xét không trả về hàng nào. Thay đổi dòng cho bất kỳ điều nào sau đây:

pics$.Active = 'TRUE' 
pics$.Active = 't' 
pics$.Active = boolean(1) 

Nó không hoạt động. Lỗi hoặc không có kết quả. Tôi đã googled cho điều này và tìm thấy một sự thiếu hụt của các truy vấn SQL thực tế trên mạng. Và chúng tôi đang ở đây.

Vì vậy: làm cách nào để sử dụng trường boolean trong mệnh đề where trong SQLite?

IDE là Quản trị viên SQLite.

Cập nhật: Vâng, tôi đã tìm thấy câu trả lời. Quản trị viên SQLite sẽ cho phép bạn tạo nên các kiểu của riêng mình; SQL tạo đó được tạo ra trông như sau:

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) 

Việc sửa chữa cho truy vấn là

AND pics$.Active = 'Y' AND pics$.Public = 'Y' 

Vấn đề thực sự ở đây là, như người trả lời đầu tiên chỉ ra, không có kiểu boolean trong SQLite . Không phải là một vấn đề, nhưng một cái gì đó để nhận thức được. Tôi đang sử dụng DbLinq để tạo lớp dữ liệu của mình; có lẽ nó không nên cho phép ánh xạ các kiểu mà SQLite không hỗ trợ. Hoặc nó sẽ ánh xạ tất cả các loại không phải là bản địa của SQLite thành một kiểu chuỗi.

Trả lời

16

SQLite không có kiểu boolean: What datatypes does SQLite support?

Điểm mấu nhận xét ra vì nó là nên làm việc, chỉ cần sử dụng giá trị nguyên 1 và 0 trong dữ liệu của bạn để đại diện cho một boolean.

+4

Phải là Quản trị viên SQLite làm tôi lo lắng.Nó có một kiểu boolean có sẵn khi bạn xây dựng bảng. Nhưng việc truy vấn trên trường đó luôn mang lại kết quả không. – jcollum

+0

xem câu trả lời của tôi trong http://stackoverflow.com/questions/4824687/how-to-include-a-boolean-in-a-sql-lite-where-clause/16880803#16880803 – Straff

4

SQLite không có kiểu boolean tích hợp - bạn phải sử dụng số nguyên thay thế. Ngoài ra, khi bạn so sánh giá trị với 'TRUE' và 't', bạn so sánh giá trị đó với các giá trị đó dưới dạng chuỗi, không phải là boolean hoặc số nguyên và do đó so sánh sẽ luôn thất bại.

Nguồn: http://www.sqlite.org/datatype3.html

11

Bạn không cần phải sử dụng bất kỳ toán tử so sánh để so sánh một giá trị boolean trong mệnh đề where của bạn.

Nếu cột 'boolean' của bạn được đặt tên is_selectable, bạn mệnh đề where sẽ chỉ đơn giản là: WHERE is_selectable

+0

Trò chuyện này là gì? Nếu bạn đang cố gắng tìm những người đã ** không thể chọn **. –

+2

WHERE NOT (is_selectable) –

+0

Chỉ cần những gì tôi cần, cảm ơn @AviCherry –

-1

-> này sẽ cho bạn quả có giá trị False của lĩnh vực is_online

select * from device_master ! nơi is_online = 1

-> này sẽ cho bạn quả có True Value của trường is_online

chọn * từ device_master trong đó is_online = 1

Các vấn đề liên quan