@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.
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
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.
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
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).
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.
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 typeIF error_flag THENUPDATE table_a SET id=8WHERE id =1;ENDIF;END;
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.
int
s). 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 aSELECT
) dibagikan, karena sangat tepat untuk mengembalikan boolean sebagai hasil yang dihitung kadang-kadang bahkan diberikan sisa argumen.DATE
tipe - bayangkan harus berurusan dengan representasi string dari tanggal sepanjang waktu :)Jawaban:
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 keNUMBER(1) 0/1
ketika 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
''=NULL
kebodohan.sumber
N
danF
digunakan, karenaON
danOFF
mulai dengan huruf yang sama ...Nggak.
Bisa menggunakan:
--- nikmati Oracle
Atau gunakan char Y / N seperti yang dijelaskan di sini
sumber
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: 89
dan NUMBER itu:Typ=2 Len=2: 193,2
Setidaknya dalam 12c, NUMBER (1) dapat menggunakan 2 byte ...Sesuai jawaban Ammoq dan kupa, Kami menggunakan angka (1) dengan nilai default 0 dan tidak mengizinkan nol.
inilah kolom tambahkan untuk diperagakan:
Semoga ini bisa membantu seseorang.
sumber
boolean intToBool(int in) { return (in != 0); }
ColumnName = 0
atauColumnName = 1
, daripadaColumnName = 0
atauColumnName <> 0
. Semantik yang terakhir tidak ramah bagi programmer. Saya juga ingin membuatnya lebih sederhana untuk optimizer kueri dengan memiliki dua nilai.Tidak di tingkat SQL dan itu sangat disayangkan. Ada satu di PLSQL
sumber
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:
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
sumber
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).
sumber
Ada tipe boolean untuk digunakan dalam pl / sql , tetapi tidak ada yang bisa digunakan sebagai tipe data kolom.
sumber
Trik hemat-ruang yang umum adalah menyimpan nilai boolean sebagai Oracle CHAR , bukan NUMBER:
sumber
Hanya karena belum ada yang menyebutkannya: menggunakan RAW (1) juga tampaknya merupakan praktik umum.
sumber
sumber