Как я могу вынудить несколько столбцов предотвращать дубликаты, но игнорировать нулевые значения?

Не отдавая слишком много:

  1. Создайте пустой список перед циклом
  2. Вместо того, чтобы вызывать print для каждого элемента, добавьте элемент в список. [112 ]

Оба шага должно быть довольно легко найти в Интернете.

Удачи!

8
задан Chris 23 March 2009 в 22:00
поделиться

4 ответа

create unique index sandbox_idx on sandbox
 (case when a is null or b is null then null else a end,
  case when a is null or b is null then null else b end);

Функциональный индекс! В основном я просто должен был удостовериться все кортежи, которые я хочу проигнорировать (т.е. - принимают), переводятся во всех, аннулирует. Ужасный, но не ужасный торец. Работы, как желаемый.

Понятый это с помощью решения другого вопроса: Как ограничить таблицу базы данных, таким образом, только одна строка может иметь конкретное значение в столбце?

Поэтому пойдите туда и дайте точки Tony Andrews также.:)

7
ответ дан 5 December 2019 в 10:05
поделиться

Попробуйте функциональный индекс:

создайте уникальный индекс sandbox_idx на песочнице (СЛУЧАЙ, КОГДА ЯВЛЯЕТСЯ ПУСТЫМ ЗАТЕМ ПУСТОЙ УКАЗАТЕЛЬ, КОГДА b ЕЩЕ ЯВЛЯЕТСЯ ПУСТЫМ ЗАТЕМ ПУСТОЙ УКАЗАТЕЛЬ || ',' || b КОНЕЦ);

Существуют другие способы освежевать эту кошку, но это - один из них.

7
ответ дан 5 December 2019 в 10:05
поделиться

Я предполагаю, что Вы можете затем.

Только для справки, хотя, я оставляю свой абзац для объяснения, почему Oracle ведет себя как этот, если у Вас есть простой уникальный индекс на двух столбцах:

Oracle никогда не будет принимать два (1, пустой указатель) пары, если столбцы будут исключительно индексированы.

Пара 1 и пустой указатель, считается "индексируемой" парой. Пара двух пустых указателей не может быть индексирована, вот почему она позволяет Вам вставить столько пустого указателя, пустые пары, сколько Вам нравится.

(1, пустой указатель), индексируется, потому что 1 может быть индексирован. В следующий раз Вы пытаетесь вставить (1, пустой указатель) снова, 1 взят индексом, и ограничение на уникальность данных нарушено.

(пустой указатель, пустой указатель), не индексируется, потому что нет никакого значения, которое будет индексировано. Вот почему это не нарушает ограничение на уникальность данных.

1
ответ дан 5 December 2019 в 10:05
поделиться

Я не парень Oracle, но вот идея, которая должна сработать, если вы можете включить вычисляемый столбец в индекс в Oracle.

Добавьте дополнительный столбец в вашу таблицу (и ваш индекс UNIQUE), который вычисляется следующим образом: он NULL, если и a, и b не равны NULL, и это таблица в противном случае - первичный ключ. Я называю этот дополнительный столбец "nullbuster" по очевидным причинам.

alter table sandbox add nullbuster as 
  case when a is null or b is null then pk else null end;
create unique index sandbox_idx on sandbox(a,b,pk);

Я приводил этот пример несколько раз примерно в 2002 году в группе Usenet microsoft.public.sqlserver.programming. Вы можете найти обсуждения, если поищите на сайте groups.google.com слово "nullbuster". Тот факт, что вы используете Oracle, не должен иметь большого значения.

PS В SQL Server это решение в значительной степени заменено отфильтрованными индексами:

create unique index sandbox_idx on sandbox(a,b)
(where a is not null and b is not null);

Тема, на которую вы ссылаетесь, предполагает, что Oracle не дает вам этот вариант. Разве у него также нет возможности индексированного представления, что является другой альтернативой?

create view sandbox_for_unique as
select a, b from sandbox
where a is not null and b is not null;

create index sandbox_for_unique_idx on sandbox_for_unique(a,b);
2
ответ дан 5 December 2019 в 10:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: