@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.
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.
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
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ą.
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 typeIF error_flag THENUPDATE table_a SET id=8WHERE id =1;ENDIF;END;
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.
int
zamiast 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 aSELECT
) są współużytkowane, ponieważ absolutnie właściwe jest zwracanie wartości logicznej jako wyniku obliczonego, nawet biorąc pod uwagę resztę argumentu.DATE
typ - wyobraź sobie, że cały czas mamy do czynienia z ciągami reprezentacji dat :)Odpowiedzi:
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/1
gdy 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ą
''=NULL
głupoty.źródło
N
i jestemF
używany, ponieważON
iOFF
zaczynam od tego samego listu ...Nie.
Można używać:
--- ciesz się Oracle
Lub użyj char Y / N, jak opisano tutaj
źródło
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: 89
i że NUMER:Typ=2 Len=2: 193,2
Przynajmniej w 12c, NUMBER (1) może używać 2 bajtów ...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ć:
Mam nadzieję, że to komuś pomoże.
źródło
boolean intToBool(int in) { return (in != 0); }
ColumnName = 0
lubColumnName = 1
, a nieColumnName = 0
lubColumnName <> 0
. Semantyka ostatniego nie jest przyjazna dla programisty. Chciałbym również uprościć optymalizator kwerendy, mając dwie wartości.Nie na poziomie SQL i szkoda, że jest jeden w PLSQL
źródło
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ć:
Po dodaniu rejestru domyślnie w tej kolumnie jest 1.
Tutaj stawiasz kontrolę ograniczającą wartość kolumny, po prostu wstawisz tylko 1 lub 0
źródło
Nie, nie istnieje typ boolean, ale zamiast tego możesz 1/0 (numer typu) lub „Y” / „N” (typ char) lub „true” / „false” (typ varchar2).
źródło
Istnieje typ boolowski do użycia w pl / sql , ale żaden nie może być użyty jako typ danych kolumny.
źródło
Typową sztuczką oszczędzającą miejsce jest przechowywanie wartości logicznych jako CHAR Oracle , a nie NUMBER:
źródło
Tylko dlatego, że nikt o tym nie wspominał: używanie RAW (1) również wydaje się powszechną praktyką.
źródło
źródło