Pole logiczne w Oracle

Wczoraj chciałem dodać pole logiczne do tabeli Oracle. Jednak w Oracle nie ma w rzeczywistości boolowskiego typu danych. Czy ktoś zna najlepszy sposób na symulację logiki logicznej? Googlowanie obiektu odkryło kilka podejść

  1. Użyj liczby całkowitej i po prostu nie przejmuj się przypisywaniem do niej niczego innego niż 0 LUB 1.

  2. Użyj pola znakowego z "Y" lub " N " jako jedynymi dwiema wartościami.

  3. Użyj enum z czekiem ograniczenie.

Czy doświadczeni programiści Oracle wiedzą, które podejście jest preferowane / kanoniczne?

Author: Lalit Kumar B, 2008-08-27

8 answers

Znalazłem ten link przydatny.

Oto akapit podkreślający niektóre z zalet / wad każdego podejścia.

Najczęściej spotykanym projektem jest naśladowanie wielu Boolean-like flagi używane przez widoki słownika danych Oracle, wybierając " Y " jako true i " N " jak false. Jednak do prawidłowego współdziałania z hostem środowiska, takie jak JDBC, OCCI i Inne Środowiska programistyczne, lepiej wybrać 0 dla false I 1 dla true, aby mogło działać prawidłowo z funkcjami getBoolean i setBoolean.

W zasadzie opowiadają się za metodą numer 2, ze względu na wydajność, używając

  • wartości 0/1 (ze względu na interoperacyjność z getBoolean() JDBC itp.) z ograniczeniem kontrolnym
  • a Typ znaku (ponieważ używa mniej spacji niż liczby).

Ich przykład:

create table tbool (bool char check (bool in (0,1));
insert into tbool values(0);
insert into tbool values(1);`
 79
Author: ColinYounger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-19 23:35:44

Oracle używa Y / N dla wartości logicznych. Dla kompletności należy zauważyć, że pl / sql ma typ boolean, to tylko tabele, które nie.

Jeśli używasz pola do wskazania, czy rekord musi być przetworzony, możesz rozważyć użycie Y i NULL jako wartości. Powoduje to bardzo mały (szybki odczyt) indeks, który zajmuje bardzo mało miejsca.

 28
Author: Leigh Riffel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-21 19:23:39

Aby użyć jak najmniejszej ilości spacji, należy użyć pola znakowego ograniczonego do ' Y ' lub 'N'. Oracle nie obsługuje typów danych typu BOOLEAN, BIT lub tinyint, więc jeden bajt CHAR jest tak mały, jak to tylko możliwe.

 26
Author: Bill the Lizard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-27 13:29:07

Najlepszą opcją jest 0 i 1 (jako liczby - inna odpowiedź sugeruje 0 i 1 jako CHAR dla wydajności przestrzeni, ale to dla mnie trochę zbyt pokręcone), używając NOT NULL i check constraint, aby ograniczyć zawartość do tych wartości. (Jeśli chcesz, aby kolumna była nullable, to nie jest to wartość logiczna, z którą masz do czynienia, ale wyliczenie z trzema wartościami...)

Zalety 0/1:

  • język niezależny. "Y" i " N " byłoby w porządku, gdyby wszyscy go używali. Ale nie. we Francji używają "O" I " N " (widziałem to na własne oczy). Nie zaprogramowałem w Finlandii, aby sprawdzić, czy używają tam " E " i " K " - bez wątpienia są mądrzejsi, ale nie możesz być pewien.
  • zgodny z praktyką w szeroko używanych językach programowania (C, C++, Perl, Javascript)
  • gra lepiej z warstwą aplikacji np. Hibernate
  • prowadzi do bardziej zwięzłego SQL, na przykład, aby dowiedzieć się, ile bananów jest gotowych do jedzenia select sum(is_ripe) from bananas zamiast select count(*) from bananas where is_ripe = 'Y' lub nawet (yuk) select sum(case is_ripe when 'Y' then 1 else 0) from bananas

Zalety "Y" / "N":

  • zajmuje mniej miejsca niż 0/1
  • to sugeruje Oracle, więc może być to, do czego niektórzy ludzie są bardziej przyzwyczajeni

Inny plakat sugerował 'Y' / null dla zysków wydajności. Jeśli masz udowodnione , że potrzebujesz wydajności, to w porządku, ale w przeciwnym razie unikaj, ponieważ to sprawia, że zapytania są mniej naturalne (some_column is null zamiast some_column = 0) i w lewym połączeniu połączysz fałsz z nieistniejącymi rekordami.

 19
Author: Andrew Spencer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-19 07:32:22

Albo 1/0 albo Y / N z ograniczeniem kontrolnym. ether way jest w porządku. Ja osobiście wolę 1/0, ponieważ wykonuję dużo pracy w Perlu, a to naprawdę ułatwia wykonywanie operacji boolowskich Perla na polach bazy danych.

Jeśli chcesz naprawdę dogłębnej dyskusji na ten temat z jednym z wyroczni głowy honchos, sprawdź, co Tom Kyte ma do powiedzenia na ten temat Tutaj

 5
Author: Matthew Watson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-31 17:11:47

Baza danych, nad którą wykonałem większość mojej pracy, używała 'Y' / ' N ' jako booleanów. Dzięki tej implementacji możesz wykonać kilka trików, takich jak:

  1. Liczba wierszy, które są prawdziwe:
    SELECT SUM (CASE WHEN BOOLEAN_FLAG = 'Y' THEN 1 ELSE 0) FROM X

  2. Podczas grupowania wierszy Wymuś logikę "jeśli jeden wiersz jest prawdą, to wszystkie są prawdą":
    WYBIERZ MAX (BOOLEAN_FLAG) Z Y
    Odwrotnie, użyj MIN, aby wymusić grupowanie false, Jeśli jeden wiersz jest false.

 4
Author: Erick B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-27 13:36:23

Roboczy przykład implementacji zaakceptowanej odpowiedzi poprzez dodanie kolumny "Boolean" do istniejącej tabeli w bazie danych oracle (przy użyciu typu number):

ALTER TABLE my_table_name ADD (
my_new_boolean_column number(1) DEFAULT 0 NOT NULL
CONSTRAINT my_new_boolean_column CHECK (my_new_boolean_column in (1,0))
);

Tworzy to nową kolumnę w my_table_name o nazwie my_new_boolean_column z domyślnymi wartościami 0. Kolumna nie akceptuje wartości NULL i ogranicza akceptowane wartości do 0 lub 1.

 2
Author: Ben.12,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-04 17:07:00

W naszych bazach danych używamy enum, które zapewnia, że przekazujemy je albo TRUE, albo FALSE. Jeśli zrobisz to na jeden z dwóch pierwszych sposobów, zbyt łatwo jest zacząć dodawać nowe znaczenie do liczby całkowitej bez przechodzenia przez odpowiedni projekt, lub skończyć z tym polem znaków o wartościach Y, y, N, n, T, t, F, F i pamiętać, która sekcja kodu używa tabeli i która wersja true jest używana.

 1
Author: Ryan Ahearn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-27 13:22:06