Czy w bazach danych Oracle jest jakiś typ boolowski?

250

Czy istnieje jakiś typ logiczny w bazach danych Oracle, podobny do BITtypu danych w MS SQL Server?

Peder
źródło
7
Niestety po wprowadzeniu Oracle nie obsługuje w pełni standardu ANSI SQL: 1999 ( en.wikipedia.org/wiki/SQL:1999 ).
Jeffrey Kemp,
2
Alternatywny punkt widzenia (dlaczego SQL nie powinien mieć typu boolowskiego): vadimtropashko.wordpress.com/2010/09/16/…
Jeffrey Kemp
7
@JeffreyKemp Ten blog jest bezsensowny. To, że niektóre wartości boolowskie mogą być obliczane na podstawie innych pól w tabeli, nie oznacza, że ​​wszystkie pola boolowskie mogą być obliczane. Na przykład „is_trusted_customer”, gdzie jest to prawdą wtedy i tylko wtedy, gdy człowiek zdecyduje: „Ufam tej osobie”.
Jakub
2
@JeffreyKemp Gratulacje, właśnie wymyśliłeś booleany w stylu C (gdzie intzamiast tego używasz s). Zdecydowanie powinniśmy wrócić do kodu. Ponadto argument całkowicie się rozpada, jeśli typy danych między kolumnami tabeli i kolumnami wyników (od a SELECT) są współużytkowane, ponieważ absolutnie właściwe jest zwracanie wartości logicznej jako wyniku obliczonego, nawet biorąc pod uwagę resztę argumentu.
jpmc26
2
Tak. Więcej typów danych, takich jak booleany, dałoby bardziej precyzyjną moc ekspresji - nie dostaniesz ode mnie żadnych argumentów na tym froncie. Cieszę się, że przynajmniej mamy DATEtyp - wyobraź sobie, że cały czas mamy do czynienia z ciągami reprezentacji dat :)
Jeffrey Kemp

Odpowiedzi:

278

Nie tylko brakuje typu danych logicznych w SQL Oracle (nie PL / SQL), ale nie mają też jasnych zaleceń co do tego, czego należy użyć. Zobacz ten wątek na asktom. Od zalecania CHAR(1) 'Y'/'N'zmieniają się, NUMBER(1) 0/1gdy ktoś wskazuje, że 'Y'/'N'zależy to od języka angielskiego, podczas gdy np. Niemieccy programiści mogliby użyć 'J'/'N'.

Najgorsze jest to, że bronią tej głupiej decyzji, tak jak bronią ''=NULLgłupoty.

Erich Kitzmueller
źródło
9
1/0 jest, jeśli nie dwuznaczne, przynajmniej mniej niejednoznaczne.
Adam Musch,
15
Ale „= NULL jest fałszem! „IS NULL jest prawdą. :)
Jim Davis,
4
Michael-O: Widziałem to kilka razy. Dla mnie przez cały czas jest to 0/1, ale inni programiści wolą J / N. (Mieszkam w kraju niemieckojęzycznym)
Erich Kitzmueller,
11
@ Irfy Ostatnio widziałem Ni jestem Fużywany, ponieważ ONi OFFzaczynam od tego samego listu ...
JimmyB
7
można argumentować, że jako zamiennik wartości logicznej „T” / „F” ma jeszcze więcej sensu
Erich Kitzmueller
56

Nie.

Można używać:

IS_COOL NUMBER(1,0)

1 - true
0 - false

--- ciesz się Oracle

Lub użyj char Y / N, jak opisano tutaj

Bohdan
źródło
6
Wolę char (1), ponieważ zużywa mniej miejsca. Możesz to sprawdzić w ten sposób: create table testbool (boolc char(1), booln number(1)); insert into testbool values ('Y', 1 ); select dump(boolc), dump(booln) from testbool; że CHAR jest przechowywany: Typ=96 Len=1: 89i że NUMER: Typ=2 Len=2: 193,2Przynajmniej w 12c, NUMBER (1) może używać 2 bajtów ...
phil_w 19.04.2016
38

Zgodnie z odpowiedziami Ammoq i Kupa używamy liczby (1) z domyślną wartością 0 i nie zezwalamy na wartości null.

oto kolumna dodawania, aby zademonstrować:

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

Mam nadzieję, że to komuś pomoże.

Alex Stephens
źródło
17
Pamiętaj, że możesz tam również przechowywać -1. Możesz dodać ograniczenie sprawdzające, aby ograniczyć wartości do 0 i 1.
David Aldridge
@DavidAldridge W logice logicznej każda liczba, która nie jest 0 (FAŁSZ), jest równa 1 (PRAWDA), więc nie ma znaczenia, która liczba jest przechowywana, co powoduje konieczność ograniczenia kontroli. Dodanie funkcji zwracającej wartość logiczną z int jest trywialne:boolean intToBool(int in) { return (in != 0); }
Agi Hammerthief
3
@AgiHammerthief Prawda, ale jeśli chcesz znaleźć wiersze przy użyciu predykatu w kolumnie „boolean”, wolałbym wiedzieć, że moje opcje to ColumnName = 0lub ColumnName = 1, a nie ColumnName = 0lubColumnName <> 0 . Semantyka ostatniego nie jest przyjazna dla programisty. Chciałbym również uprościć optymalizator kwerendy, mając dwie wartości.
David Aldridge
14

Nie na poziomie SQL i szkoda, że ​​jest jeden w PLSQL

wer. 74
źródło
13

Nie, nie ma typu logicznego w bazie danych Oracle, ale możesz to zrobić w następujący sposób:

Możesz nałożyć ograniczenie wyboru na kolumnę.

Jeśli tabela nie ma kolumny kontrolnej, możesz ją dodać:

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

Po dodaniu rejestru domyślnie w tej kolumnie jest 1.

Tutaj stawiasz kontrolę ograniczającą wartość kolumny, po prostu wstawisz tylko 1 lub 0

ALTER TABLE table_name ADD
CONSTRAINT name_constraint 
column_name_check (ONOFF in ( '1', '0' ));
Roberto Góes
źródło
9

Nie, nie istnieje typ boolean, ale zamiast tego możesz 1/0 (numer typu) lub „Y” / „N” (typ char) lub „true” / „false” (typ varchar2).

kupa
źródło
4

Typową sztuczką oszczędzającą miejsce jest przechowywanie wartości logicznych jako CHAR Oracle , a nie NUMBER:

Pranay Rana
źródło
4
CHAR (1) i VARCHAR2 (1) są identyczne pod względem wykorzystania miejsca.
Tony Andrews,
3
Jak się tutaj nauczyłem docs.oracle.com/cd/E17952_01/refman-5.5-en/char.html, kiedy opowiadamy o jednym znaku, istnieje różnica tylko między char a varchar - char używa 1 bajtu, ale varchar używa 1 bajtu na puste miejsce + 1 bajt na jeden znak -> varchar (varchar2) używa 2 bajtów na 1 znak <, gdy char używa tylko 1 bajtu
Artem.Borysov
@ Artem.Borysov: ten podręcznik dotyczy MySQL, a nie bazy danych Oracle
a_horse_w_na_name
3

Tylko dlatego, że nikt o tym nie wspominał: używanie RAW (1) również wydaje się powszechną praktyką.

Filburt
źródło
1
raw (1) jest świetny, ponieważ użytkownik nie może założyć, co jest w nim, osoba wykonująca zapytanie musi zrozumieć, co znajduje się w kolumnie raw (1) i przetłumaczyć na coś znaczącego.
Jakub
13
<sarkazm> Tak, jest tak świetny, że nie można z nim pisać przenośnego kodu jdbc. </sarcasm>
chubbsondubs
@jacob - <sarkazm> To niesamowity pomysł! Powinniśmy pozbyć się wszystkich innych typów danych i przechowywać wszystko w kolumnach RAW! Wtedy NIKT nie może arbitralnie błędnie zinterpretować danych! </sarcasm>
Bob Jarvis - Przywróć Monikę
Wyobraź sobie, że w Oracle można było zdefiniować typy danych, abyśmy mogli stworzyć typ bool, który otacza typ „raw (1)”, nazywając go bool lub boolean. Możemy wtedy zdefiniować funkcję do drukowania „prawda” lub „fałsz” w zależności od zawartości.
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
źródło
Ten przykład działa. Zauważyłem również, że mogę pracować tylko z typami logicznymi w PL / SQL. Wywoływanie boolowskie w ramach SQL nie powoduje i powoduje błąd nieprawidłowego operatora relacji.
Richard Pascual,