Добавить растровое изображение для нулей в Oracle SQL

#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