null vs пустая строка в Oracle [дубликат]

Возможные Дубликаты:
почему Oracle 9i обрабатывает пустую строку как NULL?

у меня есть таблица в Oracle 10g с именем TEMP_TABLE только с двумя столбцами -id и description просто для демонстрации.

столбец id - это последовательность, сгенерированная первичным ключом типа NUMBER(35, 0) not null и колонки DESCRIPTION тип VARCHAR2(4000) not null.

базовая структура таблицы в этом случае будет выглядеть примерно так.

+--------------+-----------+---------------+
|Name          | Null?     | Type          |
+--------------+-----------+---------------+
|ID            | NOT NULL  | NUMBER(35)    |
|DESCRIPTION   | NOT NULL  | VARCHAR2(4000)|
+--------------+-----------+---------------+

после создания этой таблицы, я пытаюсь вставить тег INSERT команды в качестве альтернативы.

INSERT INTO temp_table (id, description) VALUES (1, null); ->unsuccessful
INSERT INTO temp_table (id, description) VALUES (2, '');   ->unsuccessful

оба они неудачны, как очевидно, потому что not null ограничение на .

в обоих случаях Oracle жалуется

ORA-01400: cannot insert NULL into ("WAGAFASHIONDB"."TEMP_TABLE"."DESCRIPTION")

пустая строка рассматривается как NULL значение в Оракул.


если я уронил not null ограничение базовая структура таблицы будет выглядеть следующим образом

+--------------+-----------+---------------+
|Name          | Null?     | Type          |
+--------------+-----------+---------------+
|ID            | NOT NULL  | NUMBER(35)    |
|DESCRIPTION   |           | VARCHAR2(4000)|
+--------------+-----------+---------------+

и INSERT команды, как указано, будут успешными. Они создадут две строки один с null значение и другое с пустой строкой '' на на TEMP_TABLE.

теперь, если я выдам следующее SELECT команде

SELECT * FROM temp_table WHERE description IS NULL;

затем он извлекает обе строки, в которых есть null значение, а другой имеет пустую строку '' на .

следующее SELECT оператор, однако, не извлекает строк из TEMP_TABLE

SELECT * FROM temp_table WHERE description='';

он даже не извлекает строку, которая имеет пустую строку в .


предположительно, похоже, что Oracle лечит null значение и пустая строка '' по-другому здесь, что, однако, не похоже на случай с INSERT заявление, в котором оба a null значение и пустая строка '' запрещено вставлять в столбец с not null ограничения. Почему это так?

2 ответов


Это потому, что Oracle внутренне изменяет пустую строку на значения NULL. Oracle просто не позволит вставить пустую строку.

с другой стороны, SQL Server позволит вам делать то, что вы пытаетесь достичь.

здесь есть 2 обходных пути:

  1. используйте другой столбец, в котором указано, является ли поле "Описание" допустимым или нет
  2. используйте некоторое фиктивное значение для поля "Описание", Где вы хотите сохранить пустую строку. (т. е. установить поле будет "stackoverflowrocks", предполагая, что ваши реальные данные никогда не столкнутся с таким значением описания)

оба, конечно, тупые обходные пути:)


в oracle пустые varchar2 и null обрабатываются одинаково, и ваши наблюдения показывают это.

когда вы пишете:

select * from table where a = '';

это то же самое, что писать

select * from table where a = null;

, а не a is null

который никогда не будет приравниваться к true, поэтому никогда не возвращайте строку. то же самое на insert, NOT NULL означает, что вы не можете вставить null или пустую строку (которая рассматривается как null)