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 ограничения. Почему это так?

646   2  

2 ответов:

Это связано с тем, что Oracle внутренне изменяет пустую строку на нулевые значения. 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)

Comments

    Ничего не найдено.