Создайте уникальное ограничение с помощью nvl в Oracle

Как я могу создать уникальное ограничение, когда мне нужно рассматривать нулевые значения как равные.

За

изменить таблицу T1, добавить уникальное ограничение T1_UN (nvl(C1, ' '))

я получил

 ORA-00904: : invalid identifier

точки на нвл

Спасибо!


person dbf    schedule 16.06.2011    source источник


Ответы (2)


NOT NULL кажется лучшей идеей, но вы можете сделать индекс на основе функций уникальным:

 create unique index idx_t1 on t1 (nvl(C1, ' '));
person Thilo    schedule 16.06.2011
comment
Спасибо, похоже то, что мне нужно. - person dbf; 16.06.2011
comment
Небольшое примечание: это будет рассматривать нуль как пробел, и в результате вы больше не сможете вставлять один пробел в столбец. В зависимости от ожидаемых данных это может быть или не быть проблемой. - person Martin Schapendonk; 17.06.2011
comment
Да, но я думаю, что это было намерением, выраженным в первоначальном утверждении вопроса. - person Thilo; 17.06.2011

Просто сделайте столбец NOT NULL.

Природа NULL такова, что оно никогда ничему не равно. Следовательно, каждое значение NULL в вашем столбце уже в каком-то смысле равно UNIQUE. Нет смысла включать их в ключ UNIQUE, как вы хотите. Причина, по которой вы хотите это сделать, вероятно, заключается в существующей проблеме целостности данных. Итак, чтобы сделать столбец NOT NULL, вам, возможно, придется сначала перенести значения NULL во что-то другое...

Примечание. Вы можете просто сделать столбец UNIQUE. Тогда у вас может быть несколько значений NULL, как описано выше...

person Lukas Eder    schedule 16.06.2011
comment
Я не могу сделать его не нулевым, потому что он также должен содержать нулевые значения. - person dbf; 16.06.2011
comment
Не более одного значения NULL? Почему? - person Lukas Eder; 16.06.2011
comment
Замена на not null приведет к большому количеству изменений в кодовой базе. Насколько я знаю, можно создать индекс nvl. Мне нужен быстрый обходной путь для моего случая. - person dbf; 16.06.2011