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 значение in Оракул.
если бы я уронил 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 лечит a null значение и пустая строка '' по-другому здесь, что, однако, не похоже на случай с INSERT заявление, в котором оба a null значение и пустая строка '' не могут быть вставлены в столбец с not null ограничения. Почему это так?
2 ответов:
Это связано с тем, что Oracle внутренне изменяет пустую строку на нулевые значения. Oracle просто не позволит вставить пустую строку.
с другой стороны, SQL Server позволит вам делать то, что вы пытаетесь достичь.
здесь есть 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)
Comments