Вчера я хотел добавить логическое поле в таблицу Oracle. Однако в Oracle нет логического типа данных. Кто-нибудь здесь знает лучший способ симулировать логическое значение? Погуглив тему обнаружил несколько подходов
Используйте целое число и просто не удосуживайтесь присвоить ему что-либо кроме 0 или 1.
Используйте поле char с «Y» или «N» в качестве единственных двух значений.
Используйте перечисление с ограничением CHECK.
Знают ли опытные разработчики Oracle, какой подход является предпочтительным / каноническим?
oracle
boolean
sqldatatypes
Эли Кортрайт
источник
источник
wall
тип данных, чтобы я мог разбить себе голову при использовании логических значений.Ответы:
Я нашел эту ссылку полезной.
Вот параграф, освещающий некоторые плюсы и минусы каждого подхода.
В основном они защищают метод № 2, для эффективности, используя
getBoolean()
т. д.) с проверочным ограничениемИх пример:
источник
Сам Oracle использует Y / N для логических значений. Для полноты следует отметить, что pl / sql имеет логический тип, а не только таблицы.
Если вы используете поле, чтобы указать, нужно ли обрабатывать запись или нет, вы можете рассмотреть возможность использования Y и NULL в качестве значений. Это делает очень маленький (быстро читаемый) индекс, который занимает очень мало места.
источник
Чтобы использовать наименьшее количество места, вы должны использовать поле CHAR, ограниченное 'Y' или 'N'. Oracle не поддерживает типы данных BOOLEAN, BIT или TINYINT, поэтому один байт CHAR настолько мал, насколько вы можете получить.
источник
Наилучший вариант - 0 и 1 (в виде чисел - другой ответ предлагает 0 и 1 в качестве CHAR для эффективности использования пространства, но для меня это слишком сложно), используя NOT NULL и проверочное ограничение для ограничения содержимого этими значениями. (Если вам нужно, чтобы столбец обнулялся, то вы имеете дело не с логическим значением, а с перечислением трех значений ...)
Преимущества 0/1:
select sum(is_ripe) from bananas
вместоselect count(*) from bananas where is_ripe = 'Y'
или даже (юк)select sum(case is_ripe when 'Y' then 1 else 0) from bananas
Преимущества «Y» / «N»:
Другой автор предложил «Y» / ноль для повышения производительности. Если вы доказали, что вам нужна производительность, то достаточно справедливо, но в противном случае избегайте, так как это делает запросы менее естественными (
some_column is null
вместоsome_column = 0
), и в левом соединении вы будете путать ложность с несуществующими записями.источник
Либо 1/0, либо Y / N с проверочным ограничением. Эфирный путь в порядке. Лично я предпочитаю 1/0, так как я много работаю в Perl, и это действительно облегчает выполнение логических операций Perl над полями базы данных.
Если вы хотите действительно всесторонне обсудить этот вопрос с одним из оракулов Хонко, посмотрите, что Том Кайт должен сказать по этому поводу. Здесь
источник
База данных, над которой я работал большую часть своей работы, использовала 'Y' / 'N' как логическое значение. С этой реализацией вы можете выполнить некоторые приемы, такие как:
Подсчитайте строки, которые являются истинными:
ВЫБЕРИТЕ СУММУ (СЛУЧАЙ, КОГДА BOOLEAN_FLAG = 'Y' ТОГДА 1 ИЛИ 0) ОТ X
При группировке строк
применяйте логику «Если одна строка истинна, тогда все верны»: SELECT MAX (BOOLEAN_FLAG) FROM Y
И наоборот, используйте MIN для принудительной группировки false, если одна строка ложна.
источник
Рабочий пример реализации принятого ответа путем добавления столбца «Boolean» в существующую таблицу в базе данных Oracle (с использованием
number
типа):Это создает новый столбец в
my_table_name
вызываемойmy_new_boolean_column
со значениями по умолчанию 0. Столбец не будет приниматьNULL
значения и ограничивает принятые значения либо либо,0
либо1
.источник
В наших базах данных мы используем перечисление, которое гарантирует, что мы передадим ему значение ИСТИНА или ЛОЖЬ. Если вы сделаете это одним из первых двух способов, слишком легко либо начать добавлять новое значение к целому числу, не проходя правильную схему, либо заканчивая тем полем char, имеющим Y, y, N, n, T, t, Значения F, f и необходимость запоминания, какой раздел кода использует, какую таблицу и какую версию true она использует.
источник