Чи є булевий тип у базах даних Oracle?


250

Чи є будь-який тип булів у базах даних Oracle, подібний до BITтипу даних у пані SQL Server?


7
На жаль, Oracle не повністю підтримує стандарт ANSI SQL: 1999 ( en.wikipedia.org/wiki/SQL:1999 ), коли він був представлений.
Джефрі Кемп

2
Альтернативна точка зору (чому SQL не повинен мати булівський тип): vadimtropashko.wordpress.com/2010/09/16/…
Джеффрі Кемп

7
@JeffreyKemp Цей блог не є чуттєвим. Тільки тому, що деякі булеві долі можуть бути обчислені на основі інших полів таблиці, це не означає, що всі булеві поля можуть бути обчислені. Наприклад, "is_trusted_customer", коли це правда, якщо і лише якщо людина вирішить, "я довіряю цій людині".
Яків

2
@JeffreyKemp Вітаємо, ви щойно винайшли булеви у стилі C (де ви intзамість цього використовуєте s). Ми, безумовно, повинні повернутися до кодів. Крім того, аргумент повністю розпадається, якщо типи даних між стовпцями таблиці та стовпцями результатів (з а SELECT) поділяються спільно, оскільки абсолютно доречно повернути булевий вигляд як обчислений результат, іноді навіть з урахуванням решти аргументу.
jpmc26

2
Так. Більше типів даних, таких як булеві, давали б більш точну виразність - ви не отримаєте жодних аргументів від мене на цьому фронті. Я просто радий, що у нас є принаймні DATEтип - уявіть, що ми постійно матимемо справу зі строковими представленнями дат :)
Джеффрі Кемп

Відповіді:


278

У SQL Oracle (не PL / SQL) відсутній логічний тип даних, але вони також не мають чітких рекомендацій щодо використання. Дивіться цю тему на asktom. З рекомендацій CHAR(1) 'Y'/'N'вони переходять на те, NUMBER(1) 0/1коли хтось зазначає, що 'Y'/'N'залежить від англійської мови, тоді як, наприклад, німецькі програмісти можуть використовувати 'J'/'N'замість цього.

Найгірше, що вони захищають це дурне рішення так само, як вони захищають ''=NULLдурість.


9
1/0, якщо не неоднозначно, то принаймні менш неоднозначно.
Адам Мюш

15
Але '' = NULL помилково! '' НІЛЬНО це правда. :)
Джим Девіс

4
Майкл-О: Я це бачив кілька разів. Для мене це весь час 0/1, але інші програмісти віддають перевагу J / N. (Я живу в німецькомовній країні)
Еріх Кітцмуеллер

11
@Irfy Нещодавно я бачив Nі Fвикористовувався, тому що ONі OFFпочніть з тієї ж літери ...
JimmyB

7
можна стверджувати, що замість булевого "T" / "F" має ще більше сенсу
Еріх Кітцмюллер

56

Ні.

Можна використовувати:

IS_COOL NUMBER(1,0)

1 - true
0 - false

--- насолоджуйтесь Oracle

Або використовуйте char Y / N, як описано тут


6
Я віддаю перевагу char (1), оскільки він використовує менше місця. Ви можете перевірити це таким чином: create table testbool (boolc char(1), booln number(1)); insert into testbool values ('Y', 1 ); select dump(boolc), dump(booln) from testbool; що CHAR зберігається: Typ=96 Len=1: 89і що НОМЕР: Typ=2 Len=2: 193,2Принаймні в 12c, NUMBER (1) може використовувати 2 байти ...
phil_w

38

Відповідно до відповідей Ammoq і kupa, ми використовуємо число (1) за замовчуванням 0 і не допускаємо нулів.

ось стовпець для додавання для демонстрації:

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

Сподіваюся, що це комусь допоможе.


17
Зауважте, що ви також можете зберігати -1. Ви можете додати контрольне обмеження для обмеження значень 0 і 1.
Девід Олдрідж

@DavidAldridge У булевій логіці будь-яке число, яке не дорівнює 0 (FALSE), еквівалентне 1 (ІСТИНА), тому не має значення, яке число зберігається, анулюючи необхідність обмеження перевірки. Додавання функції, яка повертає булеву з int, є тривіальною:boolean intToBool(int in) { return (in != 0); }
Agi Hammerthief

3
@AgiHammerthief Щоправда, але якщо ви хочете знайти рядки за допомогою присудка в стовпці "boolean", я скоріше знаю, що мої варіанти є ColumnName = 0або ColumnName = 1, а не, ColumnName = 0або ColumnName <> 0. Семантика останнього не є програмістом. Я також хотів би зробити його більш простим для оптимізатора запитів, маючи два значення.
Девід Олдрідж


13

Ні, в букві Oracle Database немає булевого типу, але ви можете це зробити так:

Можна поставити контрольне обмеження на стовпчик.

Якщо у вашій таблиці немає стовпчика, ви можете додати її:

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

Коли ви додасте реєстр, за замовчуванням у цьому стовпці виходить 1.

Тут ви ставите чек, який обмежує значення стовпця, просто поставте лише 1 або 0

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

9

Ні, не існує типу булевого типу, але замість цього ви можете 1/0 (номер типу), або "Y" / "N" (тип char), або "true" / "false" (тип varchar2).



4

Поширений фокус економії місця - це зберігання булевих значень як CHARTER Oracle , а не ЧИСЛО:


4
CHAR (1) і VARCHAR2 (1) однакові за місцем використання.
Тоні Ендрюс

3
Як я дізнався тут docs.oracle.com/cd/E17952_01/refman-5.5-en/char.html, коли ми розповідаємо про один char, існує різниця лише між char та varchar - char використовує 1 байт, але varchar використовує 1 байт для порожнього простору + 1 байт для одного символу -> varchar (varchar2) використовує 2 байти за 1 символ <, коли char використовує лише 1 байт
Artem.Borysov

@ Artem.Borysov: цей посібник призначений для MySQL, а не для бази даних Oracle
a_horse_with_no_name

3

Просто тому, що ще ніхто не згадував: використання RAW (1) також здається звичайною практикою.


1
raw (1) чудово, що користувач не може припустити, що знаходиться в ньому, людина, яка виконує запит, повинна зрозуміти, що знаходиться в необробленому (1) стовпці, і перевести це на щось значуще
Яків

13
<sarcasm> Так, це так здорово, що ви не можете написати портативний код jdbc з ним. </sarcasm>
chubbsondubs

@jacob - <sarcasm> Це дивовижна ідея! Ми повинні позбутися всіх інших типів даних і зберігати все в стовпцях RAW! Тоді NOBODY міг довільно неправильно інтерпретувати дані! </sarcasm>
Боб Джарвіс -

Уявіть, якби в Oracle був якийсь спосіб визначити типи даних, щоб ми могли створити тип bool, який обгортає тип "raw (1)", називаючи його bool або boolean. Потім ми могли б визначити функцію для друку "true" або "false" залежно від вмісту.
Яків

-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;

Цей приклад працює. Я також помітив, що я можу працювати лише з булевими типами в межах PL / SQL. Булеві виклики в SQL не роблять, і виникає недійсна помилка реляційного оператора.
Річард Паскуаль
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.