Đây có phải là cách thích hợp để thực hiện kiểm tra boolean trong SQL không?


81

Giả sử hoạt động là một "trường boolean" (int nhỏ, với 0 hoặc 1)

# Find all active users
select * from users where active 

# Find all inactive users
select * from users where NOT active 

Nói cách khác, toán tử "NOT" có thể được áp dụng trực tiếp trên trường boolean không?


Có, như đã được đăng, các trường boolean thường được nhập 'bit', không phải 'int'
Davis

Tôi cho rằng bạn thực sự đang theo đuổi mã đẹp, vì bạn chắc chắn sẽ biết rằng "active = 0" là một giải pháp khả thi. Trong lựa chọn giữa "KHÔNG hoạt động" và "hoạt động = 0", tôi sẽ không bận tâm - nếu bạn nhất thiết phải giải thích nó, hãy thêm nhận xét. (Trong trường hợp ai đó làm việc với mã trong tương lai không hiểu mối quan hệ true / false <-> 1/0, có thể ai đó không nên chạm vào mã của bạn, btw ...)
Tomas Aschan 13/05

1
@Eric: Trong SQL một vị từ cần tạo ra kết quả Boolean. "Nơi hoạt động" không tạo ra kết quả như vậy, bởi vì ngay cả khi 'hoạt động' là kiểu dữ liệu BIT - BIT không phải là giá trị Boolean, nó là một giá trị số nguyên với phạm vi 0..1. Vì vậy, bạn phải thực hiện một so sánh của một số loại để tạo ra một Boolean. "where NOT (active = 1)" sẽ hoạt động, nhưng không hoạt động "where NOT active".
Tomalak

Tomalak - bạn nên đăng nhận xét đó như một câu trả lời!
womp

@Tomalak: "Trong SQL, một vị từ cần tạo ra kết quả Boolean" - không hoàn toàn. SQL thể hiện ba logic giá trị tức là TRUE, FALSE và UNKNOWN (coi rằng 'hoạt động' có thể là NULL).
onedaywhen

Câu trả lời:


87

Boolean trong SQL là một trường bit. Điều này có nghĩa là 1 hoặc 0. Cú pháp đúng là:

select * from users where active = 1 /* All Active Users */

hoặc là

select * from users where active = 0 /* All Inactive Users */

14
@ JoseBasilio- Ngoại trừ trong PostgreSQL: postgresql.org/docs/9.1/static/datatype-boolean.html
Yarin

Trong hầu hết các DB, các trường cũng có thể là NULL. Bạn cũng có thể cần kiểm tra NULL nếu bạn không định cấu hình bảng với giá trị mặc định cho trường hiện hoạt.
IAmNaN

bằng cách sử dụng SQLite trong Rails (4) nó đã thực hiện các truy vấn bằng cách sử dụng 'f' hoặc 't' (mặc dù không phải dưới dạng ký tự). Khi sử dụng truy vấn ở trên, nó không hoạt động. Mặc dù: SELECT “model".* FROM “model" WHERE “boolean_column" = ‘f'làm việc
Stefan Hendriks

25

Với Postgres, bạn có thể sử dụng

select * from users where active

hoặc là

select * from users where active = 't'

Nếu bạn muốn sử dụng giá trị số nguyên, bạn phải coi nó như một chuỗi. Bạn không thể sử dụng giá trị số nguyên.

select * from users where active = 1   -- Does not work

select * from users where active = '1' -- Works 

nhìn khắp nơi để tìm thấy nếu nó được mong đợi đúng hay TRUE hoặc 1, vì vậy câu trả lời của bạn là rất hữu ích
jpw

4
+1 Thêm về các tùy chọn boolean của PostgreSQL: postgresql.org/docs/9.1/static/datatype-boolean.html
Yarin

1
Aslo, Posgtres chấp nhận cú pháp của OP: where active, where not active. Xem postgresql.org/docs/8.2/static/functions-logical.html
Loïc Faugeron,

13

MS SQL 2008 cũng có thể sử dụng phiên bản chuỗi true hoặc false ...

select * from users where active = 'true'
-- or --
select * from users where active = 'false'

Wow, thật tuyệt ... Tôi không biết nó hoạt động nhưng chắc chắn nó hoạt động trong năm 2008+ từ thử nghiệm của tôi.
Maxim Gershkovich

11

Trong SQL Server bạn thường sử dụng. Tôi không biết về các công cụ cơ sở dữ liệu khác.

select * from users where active = 0

3

Cá nhân tôi thích sử dụng char (1) với các giá trị 'Y' và 'N' cho cơ sở dữ liệu không có kiểu gốc cho boolean. Các chữ cái được người dùng tự do hơn là các con số giả định rằng những người đọc nó bây giờ sẽ là 1 tương ứng với true và 0 tương ứng với false.

'Y' và 'N' cũng ánh xạ độc đáo khi sử dụng (N) Hibernate.


0

PostgreSQL hỗ trợ các kiểu boolean, vì vậy truy vấn SQL của bạn sẽ hoạt động hoàn hảo trong PostgreSQL.


-1

Nếu bạn đang sử dụng SQLite3, hãy cẩn thận:

Nó chỉ cần 't' hoặc 'f'. Không phải 1 hoặc 0. Không ĐÚNG HOẶC SAI.

Chỉ cần học một cách khó khăn.


1
Đây không phải là sự thật. dev.mysql.com/doc/refman/8.0/en/numeric-type-overview.html : "Các loại này là từ đồng nghĩa với TINYINT (1). Giá trị bằng 0 được coi là sai. Các giá trị khác không được coi là đúng".
Moritz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.