Apakah ada tipe boolean di database Oracle?

249

Apakah ada tipe Boolean dalam database Oracle, mirip dengan BITtipe data dalam MS SQL Server?

Peder
sumber
7
Sayangnya Oracle tidak sepenuhnya mendukung standar ANSI SQL: 1999 ( en.wikipedia.org/wiki/SQL:1999 ) ketika ini diperkenalkan.
Jeffrey Kemp
2
Sudut pandang alternatif (mengapa SQL tidak boleh memiliki tipe boolean): vadimtropashko.wordpress.com/2010/09/16/…
Jeffrey Kemp
7
@JeffreyKemp Blog itu tidak masuk akal. Hanya karena beberapa katup boolean dapat dihitung berdasarkan bidang lain dalam sebuah tabel, tidak berarti semua bidang boolean dapat dihitung. Misalnya "is_trusted_customer" di mana ini benar jika dan hanya jika manusia memutuskan, "Saya percaya orang itu."
Yakub
2
@JeffreyKemp Selamat, Anda baru saja menciptakan boolean gaya-C (tempat Anda menggunakan ints). Kami pasti harus kembali ke yang ada di kode. Selain itu, argumen benar-benar berantakan jika tipe data antara kolom tabel dan kolom hasil (dari a SELECT) dibagikan, karena sangat tepat untuk mengembalikan boolean sebagai hasil yang dihitung kadang-kadang bahkan diberikan sisa argumen.
jpmc26
2
Iya. Lebih banyak tipe data seperti boolean akan memberikan kekuatan ekspresif yang lebih tepat - Anda tidak akan mendapatkan argumen dari saya di bagian depan itu. Saya hanya senang kita setidaknya memiliki DATEtipe - bayangkan harus berurusan dengan representasi string dari tanggal sepanjang waktu :)
Jeffrey Kemp

Jawaban:

277

Tidak hanya datatype boolean yang hilang dalam SQL Oracle (bukan PL / SQL), tetapi mereka juga tidak memiliki rekomendasi yang jelas tentang apa yang harus digunakan. Lihat utas ini di asktom. Dari merekomendasikan CHAR(1) 'Y'/'N'mereka beralih ke NUMBER(1) 0/1ketika seseorang menunjukkan itu 'Y'/'N'tergantung pada bahasa Inggris, sementara misalnya programmer Jerman mungkin menggunakan 'J'/'N'sebagai gantinya.

Yang terburuk adalah mereka membela keputusan bodoh ini seperti mereka membela ''=NULLkebodohan.

Erich Kitzmueller
sumber
9
1/0 adalah, jika tidak ambigu, setidaknya kurang ambigu.
Adam Musch
15
Tapi '' = NULL salah! '' IS NULL itu benar. :)
Jim Davis
4
Michael-O: Saya sudah melihatnya beberapa kali. Bagi saya, ini 0/1 sepanjang waktu, tetapi programmer lain lebih suka J / N. (Saya tinggal di negara berbahasa Jerman)
Erich Kitzmueller
11
@ Irfy Baru-baru ini, saya melihat Ndan Fdigunakan, karena ONdan OFFmulai dengan huruf yang sama ...
JimmyB
7
orang mungkin berpendapat bahwa sebagai pengganti boolean, 'T' / 'F' bahkan lebih masuk akal
Erich Kitzmueller
55

Nggak.

Bisa menggunakan:

IS_COOL NUMBER(1,0)

1 - true
0 - false

--- nikmati Oracle

Atau gunakan char Y / N seperti yang dijelaskan di sini

Bohdan
sumber
6
Saya lebih suka char (1) karena menggunakan lebih sedikit ruang. Anda dapat memeriksanya dengan cara ini: create table testbool (boolc char(1), booln number(1)); insert into testbool values ('Y', 1 ); select dump(boolc), dump(booln) from testbool; Bahwa CHAR disimpan: Typ=96 Len=1: 89dan NUMBER itu: Typ=2 Len=2: 193,2Setidaknya dalam 12c, NUMBER (1) dapat menggunakan 2 byte ...
phil_w
38

Sesuai jawaban Ammoq dan kupa, Kami menggunakan angka (1) dengan nilai default 0 dan tidak mengizinkan nol.

inilah kolom tambahkan untuk diperagakan:

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

Semoga ini bisa membantu seseorang.

Alex Stephens
sumber
17
Perhatikan bahwa Anda dapat menyimpan -1 di sana juga. Anda dapat menambahkan batasan pemeriksaan untuk membatasi nilai 0 dan 1.
David Aldridge
@ Davidvidridge Dalam logika Boolean, angka apa pun yang bukan 0 (SALAH) sama dengan 1 (BENAR), jadi tidak masalah nomor apa yang disimpan, membatalkan kebutuhan untuk kendala pemeriksaan. Menambahkan fungsi yang mengembalikan Boolean dari int adalah sepele:boolean intToBool(int in) { return (in != 0); }
Agi Hammerthief
3
@AgiHammerthief Benar, tetapi jika Anda ingin menemukan baris menggunakan predikat pada kolom "boolean" saya lebih suka tahu bahwa opsi saya adalah ColumnName = 0atau ColumnName = 1, daripada ColumnName = 0atau ColumnName <> 0. Semantik yang terakhir tidak ramah bagi programmer. Saya juga ingin membuatnya lebih sederhana untuk optimizer kueri dengan memiliki dua nilai.
David Aldridge
14

Tidak di tingkat SQL dan itu sangat disayangkan. Ada satu di PLSQL

vc 74
sumber
13

Tidak, tidak ada tipe boolean di Oracle Database, tetapi Anda bisa melakukan ini:

Anda bisa memberi batasan cek pada kolom.

Jika tabel Anda belum memiliki kolom centang, Anda dapat menambahkannya:

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

Saat Anda menambahkan register, secara default kolom ini mendapatkan 1.

Di sini Anda memberi tanda centang yang membatasi nilai kolom, cukup beri tanda 1 atau 0

ALTER TABLE table_name ADD
CONSTRAINT name_constraint 
column_name_check (ONOFF in ( '1', '0' ));
Roberto Góes
sumber
9

Tidak ada tidak ada tipe boolean, tetapi alih-alih ini Anda dapat Anda 1/0 (nomor tipe), atau 'Y' / 'N' (tipe char), atau 'true' / 'false' (tipe varchar2).

kupa
sumber
4

Trik hemat-ruang yang umum adalah menyimpan nilai boolean sebagai Oracle CHAR , bukan NUMBER:

Pranay Rana
sumber
4
CHAR (1) dan VARCHAR2 (1) identik dalam penggunaan ruang.
Tony Andrews
3
Seperti yang saya pelajari di sini docs.oracle.com/cd/E17952_01/refman-5.5-en/char.html ketika kita menceritakan satu karakter ada perbedaan hanya antara char dan varchar - char menggunakan 1 byte, tetapi varchar menggunakan 1 byte untuk ruang kosong +1 byte untuk satu karakter -> varchar (varchar2) menggunakan 2 byte untuk 1 karakter <ketika char hanya menggunakan 1 byte
Artem.Borysov
@ Artem.Borysov: manual itu untuk MySQL, bukan untuk database Oracle
a_horse_with_no_name
3

Hanya karena belum ada yang menyebutkannya: menggunakan RAW (1) juga tampaknya merupakan praktik umum.

Filburt
sumber
1
raw (1) hebat, karena pengguna tidak dapat menganggap apa yang ada di dalamnya, orang yang melakukan kueri harus memahami apa yang ada di kolom raw (1) dan menerjemahkannya ke sesuatu yang bermakna.
Yakub
13
<sarcasm> Ya sangat luar biasa sehingga Anda tidak bisa menulis kode jdbc portabel dengannya. </
sarcasm
@ jacob - <sarcasm> Itu ide yang luar biasa! Kita harus menyingkirkan semua tipe data lain dan menyimpan semuanya di kolom RAW! Maka NOBODY dapat secara sewenang-wenang salah mengartikan data! </sarcasm>
Bob Jarvis - Reinstate Monica
Bayangkan jika ada beberapa cara di oracle untuk mendefinisikan tipe data sehingga kita bisa membuat tipe bool yang membungkus tipe 'raw (1)' yang menamakannya bool atau boolean. Kami kemudian dapat mendefinisikan fungsi untuk mencetak 'benar' atau 'salah' tergantung pada isinya.
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;
zloctb
sumber
Contoh ini berhasil. Saya juga memperhatikan bahwa saya hanya bisa bekerja dengan tipe boolean di dalam PL / SQL. Panggilan Boolean dalam SQL tidak, dan menghasilkan kesalahan operator relasional yang tidak valid.
Richard Pascual