Có bất kỳ loại boolean trong cơ sở dữ liệu Oracle?


249

Có loại Boolean nào trong cơ sở dữ liệu Oracle, tương tự như BITkiểu dữ liệu trong Ms SQL Server không?


7
Thật không may, Oracle không hỗ trợ đầy đủ tiêu chuẩn ANSI SQL: 1999 ( en.wikipedia.org/wiki/Query:1999 ) khi điều này được giới thiệu.
Jeffrey Kemp

2
Quan điểm thay thế (tại sao SQL không nên có kiểu boolean): vadimtropashko.wordpress.com/2010/09/16/ mẹo
Jeffrey Kemp

7
@JeffreyKemp Blog đó không nhạy cảm. Chỉ vì một số giá trị boolean có thể được tính dựa trên các trường khác trong bảng, không có nghĩa là tất cả các trường boolean có thể được tính. Ví dụ: "is_trusty_customer" trong đó điều này đúng khi và chỉ khi một người quyết định, "Tôi tin tưởng người đó."
Jacob

2
@JeffreyKemp Xin chúc mừng, bạn vừa phát minh lại các booleans kiểu C (nơi bạn đang sử dụng intthay thế). Chúng ta chắc chắn nên quay lại những người trong mã. Ngoài ra, đối số hoàn toàn tách rời nếu các loại dữ liệu giữa các cột bảng và cột kết quả (từ a SELECT) được chia sẻ, vì nó hoàn toàn thích hợp để trả về một boolean như một kết quả được tính toán đôi khi thậm chí còn cho phần còn lại của đối số.
jpmc26

2
Đúng. Nhiều loại dữ liệu như booleans sẽ cung cấp sức mạnh biểu cảm chính xác hơn - bạn sẽ không nhận được tranh luận nào từ tôi về mặt đó. Tôi chỉ vui mừng vì ít nhất chúng ta có một DATEloại - hãy tưởng tượng phải đối phó với các chuỗi đại diện của ngày mọi lúc :)
Jeffrey Kemp

Câu trả lời:


277

Không chỉ là kiểu dữ liệu boolean bị thiếu trong SQL của Oracle (không phải PL / SQL), mà họ cũng không có khuyến nghị rõ ràng về việc sử dụng cái gì thay thế. Xem chủ đề này trên Asktom. Từ khuyến nghị CHAR(1) 'Y'/'N'họ chuyển sang NUMBER(1) 0/1khi ai đó chỉ ra điều đó 'Y'/'N'phụ thuộc vào ngôn ngữ tiếng Anh, trong khi ví dụ, các lập trình viên người Đức có thể sử dụng 'J'/'N'thay thế.

Điều tồi tệ nhất là họ bảo vệ quyết định ngu ngốc này giống như họ bảo vệ sự ''=NULLngu ngốc.


9
1/0 là, nếu không mơ hồ, ít nhất là ít mơ hồ.
Adam Musch

15
Nhưng '' = NULL là sai! '' LÀ NULL là sự thật. :)
Jim Davis

4
Michael-O: Tôi đã thấy điều đó nhiều lần. Đối với tôi, đó là 0/1 mọi lúc, nhưng các lập trình viên khác thích J / N. (Tôi sống ở một quốc gia nói tiếng Đức)
Erich Kitzmueller

11
@Irfy Gần đây, tôi đã thấy NFđang được sử dụng, bởi vì ONOFFbắt đầu bằng cùng một chữ cái ...
JimmyB

7
người ta có thể lập luận rằng như là một thay thế cho một boolean, 'T' / 'F' thậm chí còn có ý nghĩa hơn
Erich Kitzmueller

55

Không.

Co thể sử dụng:

IS_COOL NUMBER(1,0)

1 - true
0 - false

--- thưởng thức Oracle

Hoặc sử dụng char Y / N như được mô tả ở đây


6
Tôi thích char (1) vì nó sử dụng ít không gian hơn. Bạn có thể kiểm tra theo cách này: create table testbool (boolc char(1), booln number(1)); insert into testbool values ('Y', 1 ); select dump(boolc), dump(booln) from testbool; CHAR đó được lưu trữ: Typ=96 Len=1: 89và SỐ đó: Typ=2 Len=2: 193,2Ít nhất trong 12c, SỐ (1) có thể sử dụng 2 byte ...
phil_w

38

Theo câu trả lời của Ammoq và kupa, chúng tôi sử dụng số (1) với mặc định là 0 và không cho phép null.

đây là một cột thêm để chứng minh:

ALTER TABLE YourSchema.YourTable ADD (ColumnName NUMBER(1) DEFAULT 0 NOT NULL);

Hy vọng điều này sẽ giúp được ai đó.


17
Lưu ý rằng bạn có thể lưu trữ -1 trong đó. Bạn có thể thêm một ràng buộc kiểm tra vào đó để giới hạn giá trị thành 0 và 1.
David Aldridge

@DavidAldridge Trong logic Boolean, bất kỳ số nào không phải là 0 (FALSE) đều tương đương với 1 (TRUE), do đó không có vấn đề gì về số được lưu trữ, làm mất đi sự cần thiết của ràng buộc kiểm tra. Thêm một hàm trả về Boolean từ int là chuyện nhỏ:boolean intToBool(int in) { return (in != 0); }
Agi Hammerthief

3
@Agi Hammerthief Đúng, nhưng nếu bạn muốn tìm các hàng bằng cách sử dụng một vị ngữ trên cột "boolean", tôi muốn biết rằng các tùy chọn của tôi là ColumnName = 0hoặc ColumnName = 1, hơn là ColumnName = 0hoặc ColumnName <> 0. Các ngữ nghĩa của cuối cùng không thân thiện với lập trình viên. Tôi cũng muốn giữ nó đơn giản hơn cho trình tối ưu hóa truy vấn bằng cách có hai giá trị.
David Aldridge

14

Không phải ở cấp độ SQL và điều đó thật đáng tiếc Có một cái trong PLQuery mặc dù


13

Không, không có kiểu boolean trong Cơ sở dữ liệu Oracle, nhưng bạn có thể làm theo cách này:

Bạn có thể đặt một ràng buộc kiểm tra trên một cột.

Nếu bảng của bạn không có cột kiểm tra, bạn có thể thêm nó:

ALTER TABLE table_name
ADD column_name_check char(1) DEFAULT '1';

Khi bạn thêm một thanh ghi, theo mặc định, cột này nhận được 1.

Ở đây bạn đặt một kiểm tra giới hạn giá trị cột, chỉ cần đặt 1 hoặc 0

ALTER TABLE table_name ADD
CONSTRAINT name_constraint 
column_name_check (ONOFF in ( '1', '0' ));

9

Không có loại boolean nào tồn tại, nhưng thay vào đó, bạn có thể 1/0 (số loại) hoặc 'Y' / 'N' (loại char) hoặc 'true' / 'false' (loại varchar2).



4

Một mẹo tiết kiệm không gian phổ biến là lưu trữ các giá trị boolean dưới dạng Oracle CHAR , thay vì SỐ:


4
CHAR (1) và VARCHAR2 (1) giống hệt nhau trong sử dụng không gian.
Tony Andrew

3
Như tôi đã học ở đây docs.oracle.com/cd/E17952_01/refman-5.5-en/char.html khi chúng ta kể chuyện một char chỉ tồn tại sự khác biệt giữa char và varchar - char sử dụng 1 byte, nhưng varchar sử dụng 1 byte cho không gian trống + 1 byte cho một ký tự -> varchar (varchar2) sử dụng 2 byte cho 1 ký tự <khi char chỉ sử dụng 1 byte
Artem.Borysov

@ Artem.Borysov: hướng dẫn đó dành cho MySQL, không phải cho cơ sở dữ liệu Oracle
a_horse_with_no_name

3

Chỉ vì chưa ai đề cập đến nó: sử dụng RAW (1) cũng có vẻ là thông lệ.


1
raw (1) là tuyệt vời, ở chỗ người dùng không thể giả định những gì trong đó, người thực hiện truy vấn phải hiểu những gì trong cột (1) thô và dịch nó sang một cái gì đó có ý nghĩa.
Jacob

13
<mỉa mai> Có, thật tuyệt vời khi bạn không thể viết mã jdbc di động với nó. </ sarcasm>
chubbsondub

@jacob - <mỉa mai> Đó là một ý tưởng tuyệt vời! Chúng ta nên loại bỏ tất cả các loại dữ liệu khác và lưu trữ mọi thứ trong các cột RAW! Sau đó, NOBODY có thể tùy tiện hiểu sai dữ liệu! </ Trớ trêu>
Bob Jarvis - Phục hồi Monica

Hãy tưởng tượng nếu có một cách nào đó trong orory để xác định các kiểu dữ liệu để chúng ta có thể tạo một kiểu bool bao bọc kiểu 'raw (1)' đặt tên nó là bool hoặc boolean. Sau đó, chúng tôi có thể xác định một chức năng để in 'đúng' hoặc 'sai' tùy thuộc vào nội dung.
Jacob

-1
DECLARE
error_flag  BOOLEAN := false;
BEGIN

error_flag := true;
--error_flag := 13;--expression is of wrong type

  IF error_flag THEN 

UPDATE table_a SET id= 8 WHERE id = 1;

END IF;
END;

Ví dụ này hoạt động. Tôi cũng nhận thấy rằng tôi chỉ có thể làm việc với các kiểu boolean trong PL / SQL. Các cuộc gọi Boolean trong SQL thì không và gây ra lỗi toán tử quan hệ không hợp lệ.
Richard Pascual
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.