-
> Все правильно - пока все слагаемы не известны, суммировать > опасно.
Ну тот же MSSQL :
create table xxx(A int null)
insert into xxx(A) Values (default)
insert into xxx(A) Values (1)
insert into xxx(A) Values (2)
insert into xxx(A) Values (3)
insert into xxx(A) Values (4)
Select Sum(A) from xxx
drop table xxx
----------- 10 (1 row(s) affected) Warning: Null value is eliminated by an aggregate or other SET operation.
-
Ega23 © (01.07.08 15:47) [19]
Я сильно извиняюсь, а в MSSQL пустая строка и NULL это одно и тоже, как и в Oracle ?
-
> Я сильно извиняюсь, а в MSSQL пустая строка и NULL это одно > и тоже, как и в Oracle ? >
Нет. Пустая строка <> NULL. И NULL<> пустому НД (IsEmpty).
-
Кстати, в oracle я@ora10> create table xxx(A int null);
Table created.
я@ora10> insert into xxx(A) Values (null);
1 row created.
я@ora10> insert into xxx(A) Values (1);
1 row created.
я@ora10> insert into xxx(A) Values (2);
1 row created.
я@ora10> insert into xxx(A) Values (3);
1 row created.
я@ora10> insert into xxx(A) Values (4);
1 row created.
я@ora10> Select Sum(A) from xxx;
SUM(A) ---------- 10
Но:
я@ora10> Select Sum(A+10) from xxx;
SUM(A+10) ---------- 50
то есть, в случае A is NULL, A + 10 тоже NULL
-
> Нет. Пустая строка <> NULL. И NULL<> пустому НД (IsEmpty).
тогда пример ничего не показывает
-
> Select Sum(A) from xxx
Ну, спасибо хоть Warning выдал...
-
> тогда пример ничего не показывает
Почему? При конкатенации строк если один из операндов NULL - то и результат NULL. порядок операндов не важен. В случае с числами - посложнее. по крайней мере, Warning выдаст.
ИМХО: сам использую null только в двух случаях: 1. Иерархические структуры (для определения корневого элемента) 2. При хранении метаданных (BLOB). И то не всегда.
-
Да, я напутал, агрегатные функции действительно обычно просто пропускают значения NULL, а в операциях приводят к NULL результат
-
> При конкатенации строк если один из операндов NULL - то > и результат NULL. порядок операндов не важен.
а в оракле нет, именно пример с конкатенацией я и привел в [14] в oracle пустая строка и NULL - это одно и то же. При конкатенации NULL себя ведет, как пустая строка. Вполне разумно. Мне представляется, что в Oracle тоже не понимали до конца, какое отличие с точки зрения предметной области имеют NULL и '', а главное - как их визуально отличать :)
-
> в oracle пустая строка и NULL - это одно и то же.
Однако. Не знал, что Оракловцы настолько смелы. Обычно это в стиле МС класть прибор на стандарты.
-
> Мне представляется, что в Oracle тоже не понимали до конца, > какое отличие с точки зрения предметной области имеют NULL > и '', а главное - как их визуально отличать :)
Да также, как и с PChar. p=nil и p^=''. Т.е. в одном случае - вааще хзч. В другом - всё-таки пустая строка. :)
-
> Игорь Шевченко © (01.07.08 16:01) [28]
Никогда не сталкивался, просто интересно - а как в Оракл unique key отнесётся к нескольким пустым строкам ?
-
> McSimm © (01.07.08 16:09) [31]
> а как в Оракл unique key отнесётся к нескольким пустым строкам > ?
Во, кстати, классный вопрос!
-
McSimm © (01.07.08 16:09) [31]
> а как в Оракл unique key отнесётся к нескольким пустым строкам > ?
Проигнорирует. Значения NULL в UNIQUE (именно в UNIQUE) не попадают, на чем основано немало остроумных решений проблем. Но, если ключ состоит из нескольких полей и одно может принимать значение NULL, то два набора с одинаковым значением одного поля и NULL другого поля вызовут нарушение уникальности.
pasha_golub © (01.07.08 16:08) [29]
> Однако. Не знал, что Оракловцы настолько смелы. Обычно это > в стиле МС класть прибор на стандарты.
Оракл появился немного раньше стандартов.
-
никак. форинкеи допускают нулы, а юник нет
-
> Никогда не сталкивался, просто интересно - а как в Оракл > unique key отнесётся к нескольким пустым строкам ? >
ИМХО, также, как и везде - обматерит. ЕМНИП, для MSSQL индекс допускается только в том случае, если есть только одно значение Null. Для первичного ключа - вообще не допускается. Для вторичного - можно много null (но он и не является индексом, только "кандидатом" на индекс).
-
> Например, pgAdminIII, DOA для Oracle, IBX для Interbase/Firebird...
Ну про pgAdminIII не знаю, а про IBX для Interbase/Firebird ты не прав, в IB/FB и соответственно, в компонентах это абсолютно разные вещи. Так же как и в MS SQL, т.е. по стандарту. Oracle поступает по своему, там NULL = '', по моему, обсуждалось много раз, на всех сайтах. Иногда удобно, иногда нет. Для остальных типов данных (кроме строк) Oracle работает по стандарту.
-
Однако. Не знал, что Оракловцы настолько смелы. Обычно это в стиле МС класть прибор на стандарты.
Общий подход это использовать либо спец значения типов если они есть, или флаги нулов. Пустая строка это как раз то спец значение строкового типа, которое позволяет обойтись без флагов.
-
> ЕМНИП, для MSSQL индекс допускается только в том случае, > если есть только одно значение Null.
Был неправ:
UNIQUE constraints can be defined on columns that allow null values, whereas PRIMARY KEY constraints can be defined only on columns that do not allow null values.
-
Нда, опоздал немного с ответом.
|