#sql #oracle
#sql #Oracle
Вопрос:
У меня есть следующая таблица:
Таблица1
USER_ID NAME AGE GENDER ZIP_CODE
1 John 33 M 01086
2 NULL 22 M 01247
3 Brown NULL F 01581
Я хочу добавить растровое изображение в виде столбца в конце.
USER_ID NAME AGE GENDER ZIP_CODE NULL_COLUMN
1 John 33 M 01086 00000
2 NULL 22 M 01247 01000
3 Brown NULL F 01581 00100
Логика такова
Если значение отличное от NULL, присвоите 0
Если значение = NULL, присвоить 1
Кроме того, если я сделаю столбец NULL, то ему необходимо обновить NULL_COLUMN следующим образом:
Update table1 set name = NULL;
Таблица1
USER_ID NAME AGE GENDER ZIP_CODE NULL_COLUMN
1 NULL 33 M 01086 01000
2 NULL 22 M 01247 01000
3 NULL NULL F 01581 01100
Есть ли способ в Oracle SQL создать NULL_COLUMN с использованием условий и обновлять его, когда значения становятся нулевыми?
Комментарии:
1. Почему вы хотите это сделать? Вы можете запросить, какие столбцы
NULL
по имени, без необходимости отдельного (и денормализованного!) Столбца.2. Кроме того, чтобы уточнить, под «растровым изображением» вы имеете в виду, как СУБД хранит информацию о
NULL
значениях в каждой строке, верно? Вы не имеете в виду индекс растрового изображения?3. @Dai — да — я имею в виду растровое изображение, а не растровый индекс. Я делаю это в качестве метаинформации для каждой записи для моего контроля качества.
4. @nikhilsugandh — да, две строки могут иметь одинаковое значение null.
Ответ №1:
Вы можете использовать сгенерированный столбец:
alter table table1
add null_map generated always as (nvl2(userJ_id, '1', '0') || nvl2(name, '1', '0') || nvl2(age, '1', '') || nvl2(gender, '1', '') || nvl2(zip_code, '1', '0'));
Комментарии:
1. Разве это не вернет
varchar
значение, а не истинное битовое поле / bitmap?2. @Dai . . В Oracle нет типа данных с именем «bitmap». Хотя это может быть реализовано с использованием числа, это ограничило бы количество столбцов — строка является более гибкой.
Ответ №2:
Вы могли бы использовать объединение для NVL2
select USER_ID
,NAME
,AGE
,GENDE
,ZIP_CODE
, '0' || NVL2( NAME, '1', '0' ) ||
NVL2( AGE, '1', '0' ) ||
NVL2( GENDER, '1', '0' ) ||
NVL2( ZIP_CODE, '1', '0' ) NULL_COLUMN
из my_table