Oracle veritabanlarında herhangi bir boole türü var mı?


250

Oracle veritabanlarında, BITMs SQL Server'daki veri türüne benzer bir Boolean türü var mı ?


7
Ne yazık ki Oracle , tanıtıldığında ANSI SQL: 1999 standardını ( en.wikipedia.org/wiki/SQL:1999 ) tam olarak desteklememektedir .
Jeffrey Kemp

2
Alternatif bakış açısı (SQL'in neden bir boole türü olmaması gerekir): vadimtropashko.wordpress.com/2010/09/16/…
Jeffrey Kemp

7
@JeffreyKemp Bu blog mantıklı değil. Bazı boole değerlerinin tablodaki diğer alanlara göre hesaplanabilmesi, tüm boole alanlarının hesaplanabileceği anlamına gelmez. Örneğin "is_trusted_customer", bu sadece ve ancak bir insan "O kişiye güveniyorum" diye karar verirse doğrudur.
Jacob

2
@JeffreyKemp Tebrikler, C tarzı boolean'ları yeniden icat ettiniz ( intbunun yerine s'yi kullanıyorsunuz). Kesinlikle koddakilere geri dönmeliyiz. Ayrıca, tablo sütunları ve sonuç sütunları ( a'dan) arasındaki veri türleri SELECTpaylaşılıyorsa, argüman tamamen ayrılır , çünkü bazen argümanın geri kalanı bile olsa bir boolean'ı hesaplanmış bir sonuç olarak döndürmek kesinlikle uygundur.
jpmc26

2
Evet. Booleans gibi daha fazla veri türü daha kesin ifade gücü verir - bu cephede benden hiçbir tartışma almayacaksınız. En azından bir tipimiz olduğuna sevindim DATE- her zaman tarihlerin dize temsilleriyle uğraşmak zorunda kaldığınızı hayal edin :)
Jeffrey Kemp

Yanıtlar:


278

Oracle'ın SQL'inde (PL / SQL değil) boolean veri türü eksik olmakla kalmaz, bunun yerine ne kullanacakları konusunda net bir öneri de yoktur. Asktom bu konuya bakın . Örneğin Alman programcılar bunun yerine İngilizce diline bağlı birisinin dikkatini çektiğinde öneride CHAR(1) 'Y'/'N'bulunmadan .NUMBER(1) 0/1'Y'/'N''J'/'N'

En kötüsü de bu aptalca kararı, ''=NULLaptallığı korudukları gibi savunmalarıdır .


9
1/0, belirsiz değilse, en azından daha az belirsizdir.
Adam Musch

15
Ama '' = NULL yanlış! '' NULL IS true. :)
Jim Davis

4
Michael-O: Bunu birkaç kez gördüm. Benim için her zaman 0/1, ancak diğer programcılar J / N'yi tercih ediyor. (Almanca konuşulan bir ülkede yaşıyorum)
Erich Kitzmueller

11
@Irfy Son zamanlarda, testere Nve Fçünkü kullanılan ONve OFFaynı harfle başlayan ...
JimmyB

7
bir boole yerine 'T' / 'F' nin daha mantıklı olduğu
söylenebilir

56

Hayır!

Kullanabilirsiniz:

IS_COOL NUMBER(1,0)

1 - true
0 - false

--- Oracle'ın tadını çıkarın

Veya burada açıklandığı gibi char Y / N kullanın


6
Char (1) 'i tercih ediyorum çünkü daha az yer kaplıyor. Bu şekilde kontrol edebilirsiniz: create table testbool (boolc char(1), booln number(1)); insert into testbool values ('Y', 1 ); select dump(boolc), dump(booln) from testbool; Bu CHAR depolanır: Typ=96 Len=1: 89ve bu NUMBER: Typ=2 Len=2: 193,2En az 12c, NUMBER (1) 2 bayt kullanabilir ...
phil_w

38

Cephane ve kupa'nın cevaplarına göre, varsayılan olarak 0 (1) sayısını kullanıyoruz ve null değerlerine izin vermiyoruz.

göstermek için bir sütun ekle :

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

Umarım bu birine yardımcı olur.


17
Orada -1 de saklayabileceğinizi unutmayın. Değerleri 0 ve 1 ile sınırlamak için bir kontrol kısıtlaması ekleyebilirsiniz.
David Aldridge

@DavidAldridge: Boole mantığında, 0 (YANLIŞ) olmayan herhangi bir sayı 1'e (DOĞRU) eşdeğerdir, bu nedenle hangi numaranın depolandığı önemli değildir ve kontrol kısıtlaması ihtiyacını ortadan kaldırır. boolean intToBool(int in) { return (in != 0); }
Int'den

3
@AgiHammerthief Doğru, ama ben daha çok seçeneklerim olduğunu bilemez "boolean" sütununda bir yüklemi kullanarak satırları bulmak istiyorsanız ColumnName = 0veya ColumnName = 1ziyade, ColumnName = 0veya ColumnName <> 0. Sonuncunun anlambilimi programcı dostu değildir. Ayrıca iki değer alarak sorgu eniyileyici için daha basit tutmak istiyorum.
David Aldridge

14

SQL düzeyinde değil ve çok yazık PLSQL'de bir tane var


13

Hayır, Oracle Database'de bir boole türü yok, ancak şu şekilde yapabilirsiniz:

Bir sütuna bir kontrol kısıtlaması koyabilirsiniz.

Tablonuzda bir kontrol sütunu yoksa ekleyebilirsiniz:

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

Bir kayıt eklediğinizde, bu sütun varsayılan olarak 1 olur.

Burada, sütun değerini sınırlayan bir onay koyun, sadece 1 veya 0 koyun

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

9

Hayır, boolean türü yoktur, ancak bunun yerine 1/0 (tür numarası) veya 'Y' / 'N' (tür char) veya 'true' / 'false' (varchar2 türü) yapabilirsiniz.



4

Yer tasarrufu sağlayan yaygın bir numara, boole değerlerini NUMBER yerine Oracle CHAR olarak depolamaktır :


4
CHAR (1) ve VARCHAR2 (1) alan kullanımında aynıdır.
Tony Andrews

3
Burada öğrendiğim gibi docs.oracle.com/cd/E17952_01/refman-5.5-en/char.html Bir karakterin hikayesini anlattığımızda sadece char ve varchar arasında karakter var - char 1 bayt kullanıyor, ancak varchar boş alan için 1 bayt kullanıyor Bir karakter için + 1 bayt -> varchar (varchar2), 1 karakter için 2 bayt kullanır <char yalnızca 1 bayt kullandığında
Artem.Borysov

@ Artem.Borysov: bu kılavuz MySQL içindir, Oracle veritabanı için değil
a_horse_with_no_name

3

Henüz kimse bundan bahsetmediği için: RAW (1) kullanmak da yaygın bir uygulama gibi görünüyor.


1
raw (1), kullanıcının içinde ne olduğunu varsayamayacağı için, sorguyu yapan kişinin raw (1) sütununda ne olduğunu anlaması ve anlamlı bir şeye çevirmesi gerekir.
Jacob

13
<sarcasm> Evet o kadar harika ki onunla taşınabilir jdbc kodu yazamıyorsunuz. </sarcasm>
chubbsondubs

@jacob - <sarkasm> Bu inanılmaz bir fikir! Diğer tüm veri türlerinden kurtulmalı ve her şeyi RAW sütunlarında depolamalıyız! O zaman NOBODY, verileri keyfi olarak yanlış yorumlayabilir! </sarcasm>
Bob Jarvis - Monica'yı eski

Veri türlerini tanımlamanın bir yolu olup olmadığını düşünün, böylece bool veya boolean olarak adlandırılan 'raw (1)' türünü saran bir bool türü oluşturabiliriz. Daha sonra içeriğe bağlı olarak 'true' veya 'false' yazdırmak için bir işlev tanımlayabiliriz.
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;

Bu örnek işe yarar. Ben de sadece PL / SQL içindeki boole türleri ile çalışabildiğimi fark ettim. SQL içindeki Boole çağrıları yapmaz ve geçersiz bir ilişkisel operatör hatası verir.
Richard Pascual
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.