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 обходных пути:
- используйте другой столбец, в котором указано, является ли поле "Описание" допустимым или нет
- используйте некоторое фиктивное значение для поля "Описание", Где вы хотите сохранить пустую строку. (т. е. установить поле будет "stackoverflowrocks", предполагая, что ваши реальные данные никогда не столкнутся с таким значением описания)
оба, конечно, тупые обходные пути:)
в oracle пустые varchar2 и null обрабатываются одинаково, и ваши наблюдения показывают это.
когда вы пишете:
select * from table where a = '';
это то же самое, что писать
select * from table where a = null;
, а не a is null
который никогда не будет приравниваться к true, поэтому никогда не возвращайте строку. то же самое на insert, NOT NULL означает, что вы не можете вставить null или пустую строку (которая рассматривается как null)