Kemarin saya ingin menambahkan bidang boolean ke tabel Oracle. Namun, sebenarnya tidak ada tipe data boolean di Oracle. Apakah ada orang di sini yang tahu cara terbaik untuk mensimulasikan boolean? Googling subjek menemukan beberapa pendekatan
Gunakan bilangan bulat dan jangan repot-repot menetapkan selain dari 0 atau 1 untuk itu.
Gunakan bidang char dengan 'Y' atau 'N' sebagai dua nilai saja.
Gunakan enum dengan batasan PERIKSA.
Apakah pengembang Oracle yang berpengalaman tahu pendekatan mana yang lebih disukai / kanonik?
oracle
boolean
sqldatatypes
Eli Courtwright
sumber
sumber
wall
tipe data sehingga saya bisa menghancurkan kepala saya saat menggunakan boolean.Jawaban:
Saya menemukan tautan ini bermanfaat.
Berikut adalah paragraf yang menyoroti beberapa pro / kontra dari setiap pendekatan.
Pada dasarnya mereka menganjurkan metode nomor 2, demi efisiensi, menggunakan
getBoolean()
dll) dengan kendala cekContoh mereka:
sumber
Oracle sendiri menggunakan Y / N untuk nilai Boolean. Untuk kelengkapan harus dicatat bahwa pl / sql memiliki tipe boolean, hanya tabel yang tidak.
Jika Anda menggunakan bidang untuk menunjukkan apakah catatan perlu diproses atau tidak, Anda dapat mempertimbangkan menggunakan Y dan NULL sebagai nilai. Ini menghasilkan indeks sangat kecil (baca cepat) yang hanya membutuhkan sedikit ruang.
sumber
Untuk menggunakan jumlah ruang paling sedikit, Anda harus menggunakan bidang CHAR terbatas ke 'Y' atau 'N'. Oracle tidak mendukung tipe data BOOLEAN, BIT, atau TINYINT, jadi satu byte CHAR sekecil yang Anda bisa dapatkan.
sumber
Pilihan terbaik adalah 0 dan 1 (sebagai angka - jawaban lain menunjukkan 0 dan 1 sebagai CHAR untuk efisiensi ruang tapi itu agak terlalu bengkok bagi saya), menggunakan BUKAN NULL dan batasan periksa untuk membatasi konten ke nilai-nilai tersebut. (Jika Anda ingin kolom menjadi nullable, maka itu bukan boolean yang Anda hadapi tetapi enumerasi dengan tiga nilai ...)
Keuntungan 0/1:
select sum(is_ripe) from bananas
alih-alihselect count(*) from bananas where is_ripe = 'Y'
atau bahkan (yuk)select sum(case is_ripe when 'Y' then 1 else 0) from bananas
Keuntungan dari 'Y' / 'N':
Poster lain menyarankan 'Y' / null untuk keuntungan kinerja. Jika Anda telah membuktikan bahwa Anda membutuhkan kinerja, maka cukup adil, tetapi jika tidak hindari karena membuat kueri kurang alami (dan
some_column is null
bukannyasome_column = 0
) dan di gabung kiri Anda akan menyalahartikan kepalsuan dengan catatan yang tidak ada.sumber
Baik 1/0 atau Y / N dengan batasan cek di atasnya. cara eter baik-baik saja. Saya pribadi lebih suka 1/0 karena saya banyak bekerja di perl, dan itu membuatnya sangat mudah untuk melakukan operasi perl Boolean di bidang basis data.
Jika Anda ingin diskusi yang sangat mendalam tentang pertanyaan ini dengan salah satu kepala honorer Oracles, lihat apa yang dikatakan Tom Kyte tentang ini Di Sini
sumber
Basis data yang saya lakukan sebagian besar pekerjaan saya menggunakan 'Y' / 'N' sebagai boolean. Dengan implementasi itu, Anda dapat melakukan beberapa trik seperti:
Hitung baris yang benar:
SELECT SUM (KASUS KETIKA BOOLEAN_FLAG = 'Y' KEMUDIAN 1 LAIN 0) DARI X
Saat mengelompokkan baris,
jalankan logika "Jika satu baris benar, maka semuanya benar" logika: SELECT MAX (BOOLEAN_FLAG) DARI Y
Sebaliknya, gunakan MIN untuk memaksa pengelompokan itu salah jika satu baris salah.
sumber
Contoh yang berfungsi untuk mengimplementasikan jawaban yang diterima dengan menambahkan kolom "Boolean" ke tabel yang ada di database oracle (menggunakan
number
tipe):Ini menciptakan kolom baru yang
my_table_name
disebutmy_new_boolean_column
dengan nilai default 0. Kolom tidak akan menerimaNULL
nilai dan membatasi nilai yang diterima baik0
atau1
.sumber
Dalam basis data kami, kami menggunakan enum yang memastikan kami memberikannya BENAR atau SALAH. Jika Anda melakukannya salah satu dari dua cara pertama, terlalu mudah untuk mulai menambahkan makna baru ke integer tanpa melalui desain yang tepat, atau berakhir dengan bidang char yang memiliki Y, y, N, n, T, t, t, F, f menghargai dan harus mengingat bagian kode mana yang menggunakan tabel mana dan versi mana yang benar yang digunakannya.
sumber