Есть ли логический тип в базах данных Oracle?

141

Существует ли логический тип в оракулных базах данных, аналогичный типу BIT в MS SQL?

  • 6
    К сожалению, Oracle не полностью поддерживала стандарт ANSI SQL: 1999 ( en.wikipedia.org/wiki/SQL:1999 ), когда он был представлен.
  • 2
    Альтернативная точка зрения (почему SQL не должен иметь логический тип): vadimtropashko.wordpress.com/2010/09/16/…
Показать ещё 15 комментариев
Теги:
database
boolean

10 ответов

164

В Oracle SQL (не PL/SQL) отсутствует некий логический тип данных, но у них также нет четкой рекомендации относительно того, что использовать. См. этот поток на asktom. Из рекомендаций CHAR(1) 'Y'/'N' они переключаются на NUMBER(1) 0/1, когда кто-то указывает, что 'Y'/'N' зависит от английского языка, в то время как, например, Немецкие программисты могут вместо этого использовать 'J'/'N'.

Хуже всего то, что они защищают это глупое решение, как будто они защищают глупость ''=NULL.

  • 7
    1/0, если не двусмысленно, по крайней мере менее двусмысленно.
  • 0
    Я также предпочитаю 1/0, но, конечно, вы также найдете людей с фоном Visual Basic, которые вместо этого выберут -1/0. ИМО, есть только одно вменяемое решение этой проблемы: Oracle должен создать логический тип данных. Не может быть так сложно, когда почти у каждой другой СУБД есть такая.
Показать ещё 15 комментариев
26

Неа.

Может использовать:

IS_COOL NUMBER(1,0)

1 - true
0 - false

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

Или используйте char Y/N как описано здесь

  • 4
    Я предпочитаю 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 и что NUMBER: Typ=2 Len=2: 193,2 По крайней мере, в 12c NUMBER (1) может использовать 2 байта ...
23

В соответствии с ответами Ammoq и kupa, мы используем число (1) со значением по умолчанию 0 и не допускаем null.

здесь добавьте столбец для демонстрации:

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

Надеюсь, это поможет кому-то.

  • 14
    Обратите внимание, что вы можете хранить -1 там же. Вы можете добавить проверочное ограничение, чтобы ограничить значения 0 и 1.
  • 0
    @DavidAldridge В логической логике любое число, отличное от 0 (FALSE), равно 1 (TRUE), поэтому не имеет значения, какое число хранится, что устраняет необходимость в проверочном ограничении. Добавление функции, которая возвращает логическое значение из int, тривиально: boolean intToBool(int in) { return (in != 0); }
Показать ещё 1 комментарий
13

Не на уровне SQL и жаль В PLSQL есть один, хотя

8

Нет такого типа boolean, но вместо этого вы можете использовать 1/0 (номер типа) или 'Y'/'N' (тип char), или 'true'/'false' (тип varchar2).

4

Общим трюком для экономии пространства является сохранение значений boolean как Oracle CHAR, а не NUMBER:

  • 4
    CHAR (1) и VARCHAR2 (1) идентичны в использовании пространства.
  • 3
    Как я узнал здесь, docs.oracle.com/cd/E17952_01/refman-5.5-en/char.html когда мы рассказываем один символ, существует различие только между char и varchar - char использует 1 байт, но varchar использует 1 байт для пустого пространства + 1 байт для одного символа -> varchar (varchar2) использует 2 байта для 1 символа <, когда char использует только 1 байт
4

Существует тип boolean для использования в pl/sql, но ни один из них не может использоваться в качестве типа данных столбца.

3

Просто потому, что никто не упомянул об этом: использование RAW (1) также кажется обычной практикой.

  • 0
    Функция raw (1) хороша тем, что пользователь не может предположить, что в ней, человек, выполняющий запрос, должен понять, что находится в столбце raw (1), и перевести его во что-то осмысленное.
  • 11
    <sarcasm> Да, это так здорово, что вы не можете написать переносимый код JDBC с ним. </ sarcasm>
1

Нет, в базе данных Oracle нет булева типа, но вы можете сделать так:

Вы можете поместить ограничение проверки на столбец.

Если в таблице нет столбца проверки, вы можете добавить его:

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' ));
-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;
  • 0
    Этот пример работает. Я также заметил, что я могу работать только с логическими типами в PL / SQL. Булевых вызовов в SQL нет, и выдает недопустимую ошибку реляционного оператора.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню