Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.10.29;
Скачать: [xml.tar.bz2];

Вниз

Понятие NULL   Найти похожие ветки 

 
Тульский ©   (2006-09-28 08:45) [0]

Смотрю методичку по лаб. работам с БД. И вижу:
Значение NULL. Значение NULL в SQL - это неизвестное значение, которое не следует путать с пустым. Пустое значение - это отсутствие данных, в случае же значения NULL неизвестно, какое зна-чение должно быть записано в данном поле. Значения NULL трактуются в SQL особым образом. Пустые значения равны друг другу, значения NULL — не равны, что интуитивно по-нятно, так как это неизвестные значения, а два неизвестных значения не должны обяза-тельно быть равны друг другу.
По-моему, гон. Википидия дает определение NULL как отсутствующее значение. Учебник от Microsoft Corporation Проектирование и реализация баз данных Microsoft SQL Server 2000. Учебный курс MCAD/
MCSE, MCDBA/ И вовсе называет NULL - пустым значением.
А вы как считаете?


 
Внук ©   (2006-09-28 08:47) [1]

Тут скорее всего имеется в виду, что пустая строка и NULL - не одно и то же. Хотя изложено коряво.


 
Sergey13 ©   (2006-09-28 09:19) [2]

У разных серверов наверное и слегка разные интерпретации NULL. Например в Оракле вставляя "" вставляется NULL. В ФБ вставятся именно "" и NULL, т.е. по разному.


 
pasha_golub ©   (2006-09-28 09:27) [3]

Mantra:
NULL is a state, not a value.
NULL is a state, not a value.
NULL is a state, not a value.


Кстати, мужики, есть у кого-нибудь короткие такие определения или что-нибудь эдакое, что может служить подсказкой дня (tip of the day) при старте програмы? Интересует дизайн БД.


 
Sergey13 ©   (2006-09-28 09:30) [4]

> [3] pasha_golub ©   (28.09.06 09:27)

Нормализация - не цель, а метод.
Занимаясь нормализацией главное не переусердствовать.

8-)


 
pasha_golub ©   (2006-09-28 09:40) [5]


> Sergey13 ©   (28.09.06 09:30) [4]

Круто. :-) А англицкий вариант есть? Я то переведу, просто может эта фраза уже узнаваема в каком-либо виде.


 
Sergey13 ©   (2006-09-28 09:47) [6]

> [5] pasha_golub ©   (28.09.06 09:40)

Если честно, это мои фразы (хотя на уникальность не претендую 8-), посему аглицкого варианта нет. Переводи как хочешь. Ссылка на меня НЕ обязательна.
8-)


 
Johnmen ©   (2006-09-28 09:48) [7]


> Тульский ©   (28.09.06 08:45) 


Хорошо изложено, доходчиво и понятно.
А от того, что палец назовут ж...й, он пальцем быть не перестанет :))


 
Курдль ©   (2006-09-28 09:51) [8]


> Sergey13 ©   (28.09.06 09:19) [2]
> Например в Оракле вставляя "" вставляется NULL.

Не верю! :(  
Надо срочно проверить. А то я - наивный чукотский мальчик, думал, что вставляется значение, равное пустой строке...


 
Sergey13 ©   (2006-09-28 10:04) [9]

> [8] Курдль ©   (28.09.06 09:51)

Я перед тем как писать проверил на 8.1.7. 8-)


 
Тульский ©   (2006-09-28 10:05) [10]


> Johnmen ©   (28.09.06 09:48) [7]


> Хорошо изложено, доходчиво и понятно.

Но неправильно.


 
Курдль ©   (2006-09-28 10:28) [11]


> Sergey13 ©   (28.09.06 10:04) [9]
> Я перед тем как писать проверил на 8.1.7. 8-)

Черт! Оракла под рукой нет. Проверил на DB2 AS/400.
Запросы
select count(*) from T where F is Null
select count(*) from T where F = ""

выдают совершенно разные ответы...


 
Sergey13 ©   (2006-09-28 10:33) [12]

> [11] Курдль ©   (28.09.06 10:28)

Я создал табличку test(id,name). Вставил туда
insert into test(id,name) values(1,"");
insert into test(id,name) values(2,NULL);
select * from test where name is NULL
1
2
select * from test where name=""
данных нет.


 
Johnmen ©   (2006-09-28 10:44) [13]


> Тульский ©   (28.09.06 10:05) [10]
> Но неправильно.


Что конкретно неправильно?


 
Тульский ©   (2006-09-28 11:42) [14]

вот это:

> Значение NULL в SQL - это неизвестное значение


 
Palladin ©   (2006-09-28 11:46) [15]

почему? для "неизвестного значения" в SQL есть что то другое?


 
Johnmen ©   (2006-09-28 12:07) [16]


> Тульский ©   (28.09.06 11:42) [14]
> вот это:> Значение NULL в SQL - это неизвестное значение


А что, известное?
Да и дело не в терминах. А в сути. Про палец я уже говорил :)


 
Тугодум ©   (2006-09-28 12:09) [17]

Oracle must die? :)


 
Reindeer Moss Eater ©   (2006-09-28 12:47) [18]

Oracle must have!

Прикол с пустой строкой и нулом там с незапамятных времен. Это не баг а фича!

select sysdate from dual where "" = ""


 
Тугодум ©   (2006-09-28 13:09) [19]

Reindeer Moss Eater ©   (28.09.06 12:47) [18]

Что в результате? Системная дата в единственном экземпляре?


 
Reindeer Moss Eater ©   (2006-09-28 13:13) [20]

В результате пустой НД


 
Баба Яга   (2006-09-28 13:14) [21]


> А что, известное?
> Да и дело не в терминах. А в сути. Про палец я уже говорил
> :)

Уважаемый, если вы не понимаете логики SQL, то может стоит задуматься над тем, что называть пальцем, а кого им делали, и соответственно кто чем думает.
SQL запрос должен выдавать только то, что ТОЧНО соответствует запросу. И если в запросе стоит условие = "", то должны учитываться только пустые строки, а в строках с NULL нет ничего (например ещё не присвоено), даже пустой строки, поэтому они не соответствуют условию. Если вы этого не понимаете, то не надо говорить что палец это ж..а, а то возникают сомнения по поводу того, чем вы думаете.


 
Игорь Шевченко ©   (2006-09-28 13:19) [22]

Баба Яга   (28.09.06 13:14) [21]

В SQL равенство с NULL никто вроде не пишет. Обычно для этого используется оператор IS, который прекрасно выбирает по условию IS NULL


> Если вы этого не понимаете


Эта...при блистании интеллектом все-таки за словарным запасом надо следить. Вытру нафиг.


 
Баба Яга   (2006-09-28 13:32) [23]


> Эта...при блистании интеллектом все-таки за словарным запасом
> надо следить. Вытру нафиг.

Мильён пардонов, действительно уважаемый! Никоим образом не хотел оскорбить чувств присутствующих, я лишь употребил цитаты, из написанного ранее, но если это кого задело, то примите мои искренние извинения.
В моём сообщении нет записи "=NULL". Но ваше замечание ценно ещё и тем, для понимания вопроса, что к понятию NULL условие равенства даже не применяется, в отличие от "пустой строки", которую сравнивать разрешено.


 
Johnmen ©   (2006-09-28 13:45) [24]


> Уважаемый, если вы не понимаете логики SQL


А если понимаю, то что?


> Если вы этого не понимаете


А если понимаю, то что?

Почему логическое выражение неполное? В NULL ушло?


 
Баба Яга   (2006-09-28 13:50) [25]


> А если понимаю, то что?

Если бы понимали, то не написали бы:

> А от того, что палец назовут ж...й, он пальцем быть не перестанет
> :))


 
Sergey13 ©   (2006-09-28 13:52) [26]

> [25] Баба Яга   (28.09.06 13:50)

А ты не согласен? Ты считаешь, что палец после переименования, станет мягче и толще? 8-)


 
Johnmen ©   (2006-09-28 13:54) [27]

>Если бы понимали, то не написали бы:

Ваше мнение мне очень интересно и важно!
Расскажите мне, ламеру, как пользоваться пальцем и ж...й, а то никогда с этим не сталкивался.
Спасибо, мой добрый друг.


 
Баба Яга   (2006-09-28 13:59) [28]

Johnmen ©   (28.09.06 13:54) [27]
Благодарю.
Однако смею заверить, что Ваше мнение интересует окружающих, так же сильно, как и моё, тем более, что Вы его очень убедительно аргументируете.
Однако это уже переходит в личное общение и глубокоуважаемый модератор имеет все основания удалить эти сообщения. Не будем засорять тему.


 
Johnmen ©   (2006-09-28 14:01) [29]


> Баба Яга   (28.09.06 13:59) [28]
> так же сильно, как и моё,


Не льсти себе, мой загадочный друг.


 
Внук ©   (2006-09-28 14:52) [30]

Изложено коряво. Потому что надо уточнять, что под пустым значением имеется в виду строка нулевой длины. Иначе возникает вопрос - что такое "пустая дата" и "пустое число". В двух последних случаях понятие "пустое значение" не имеет смысла. Есть либо некоторое значение, либо отсутствие значения (неизвестное значение, NULL).
То, как Oracle обходится с пустой строкой - печальный факт, но не образец для подражания.


 
kaif ©   (2006-09-28 15:41) [31]

Вообще тема интересная.
Изложено, действительно, криво.

значения NULL — не равны

Например из сказанного неясно, что вернет такое вот выражение:

(Field1 = NULL) or (Field1 <> NULL)

Судя по сказанному, вернет TRUE.
А вот судя по ИМХО, вернет опять NULL
:)


 
Тульский ©   (2006-09-28 15:58) [32]

DECLARE @A INT, @B INT
SET @A = Null
SET @B = Null

if @A = @B print "TRUE" else print "FALSE"
if @A <> @B print "TRUE" else print "FALSE"

---
Результат:

FALSE
FALSE


 
vuk ©   (2006-09-28 23:13) [33]

Какое такое нафиг неизвестное значение? Данные, они либо есть либо нет(NULL). Третьего не бывает. Сравнивать с нечто с понятием "нет данных" смысла особого нет, поэтому при сравнении получаем false. При сложении чего угодно с NULL получим опять же NULL.


 
Ученик чародея.   (2006-09-28 23:35) [34]


> Смотрю методичку по лаб. работам с БД. И вижу:
> Значение NULL. Значение NULL в SQL - это неизвестное значение,
>  которое не следует путать с пустым. Пустое значение - это
> отсутствие данных, в случае же значения NULL неизвестно,
>  какое зна-чение должно быть записано в данном поле. Значения
> NULL трактуются в SQL особым образом. Пустые значения равны
> друг другу, значения NULL — не равны, что интуитивно по-
> нятно, так как это неизвестные значения, а два неизвестных
> значения не должны обяза-тельно быть равны друг другу.
> По-моему, гон. Википидия дает определение NULL как отсутствующее
> значение. Учебник от Microsoft Corporation Проектирование
> и реализация баз данных Microsoft SQL Server 2000. Учебный
> курс MCAD/
> MCSE, MCDBA/ И вовсе называет NULL - пустым значением.
> А вы как считаете?


При логических операциях со значениями типа Null в БД получается третье логическое значение Unknown, а не True или False.

Советую почитать книгу Гектор Гарсиа-Молина, Джеффри Д. Ульман, Дженнифер Уидом "Системы баз данных полный курс". Хотя у Дейта лучше описывается.


 
evvcom ©   (2006-09-29 08:59) [35]

> [8] Курдль ©   (28.09.06 09:51)
> Не верю! :(  

А зря. Так и есть. Oracle 9.2

> [17] Тугодум ©   (28.09.06 12:09)

Не... Тугодум must die! :-)

> [30] Внук ©   (28.09.06 14:52)
> То, как Oracle обходится с пустой строкой - печальный факт,
> но не образец для подражания

А какой смысл разделять понятия "пустая строка" и "пустое значение в строке"? Каков практический смысл? Практически каждый день пишу на нем, и ни разу не было даже мысли, что здесь разработчики оракла не правы.

> [32] Тульский ©   (28.09.06 15:58)

Надо было писать "... else print "FALSE или неопределено""!
[0] А в методичке упоминается какая-нить конкретная СУБД? Для каких-то это верно, для Оракла - лажа.


 
Тугодум ©   (2006-09-29 09:15) [36]

evvcom ©   (29.09.06 08:59) [35]

А какой смысл разделять понятия "пустая строка" и "пустое значение в строке"? Каков практический смысл? Практически каждый день пишу на нем, и ни разу не было даже мысли, что здесь разработчики оракла не правы.

Да уж, человек ко всему привыкает. Я думаю, если бы в Oracle не было бы и пустой строки, а была бы строка из одного пробела, ты бы то же самое сказал:
А какой смысл разделять понятия "пустая строка" и "строка из одного пробела"? Каков практический смысл? Практически каждый день пишу на нем, и ни разу не было даже мысли, что здесь разработчики оракла не правы

:)


 
Внук ©   (2006-09-29 09:20) [37]

>>evvcom ©   (29.09.06 08:59) [35]
>>Каков практический смысл? Практически каждый день пишу на нем, и ни разу не было даже мысли, что здесь разработчики оракла не правы.
 Практически - никакого. Тоже почти каждый день пишу на нем, и не страдаю. Но теоретически - не правы.


 
Внук ©   (2006-09-29 09:22) [38]

Например, запрос
Select * from table1 where field1="" будет работать не так, как следовало бы ожидать теоретически


 
Тугодум ©   (2006-09-29 09:51) [39]

Внук ©   (29.09.06 09:20) [37]

Ну вот первый пришедший на ум случай - заполняется БД с каким-либо необязательным полем, причем оператор может выбрать NULL для указания того, что значение ему неизвестно, либо указать "", если значение - пустая строка.
Например, пусть это будет номер мобильного телефона или отчество.
Возможно, кто-то из других операторов знает нужное значение и сможет затем отредактировать строку и заменить NULL. Но в Oracle придется заводить еще одно поле, чтобы оператору не пришлось каждый раз просматривать записи с "" и догадываться, настоящиая это пустая строка или всего лишь неизвестное значение.


 
Sergey13 ©   (2006-09-29 09:59) [40]

> [39] Тугодум ©   (29.09.06 09:51)

Фантазер. 8-)
Просто надо знать особенности того инструмента (а сервер БД это именно инструмент) с которым работаешь. Х.З. почему Ораклы так обрабатывают NULL, но наверное не с бухты-барахты.


 
Тугодум ©   (2006-09-29 10:22) [41]

Sergey13 ©   (29.09.06 09:59) [40]


Просто надо знать особенности того инструмента (а сервер БД это именно инструмент) с которым работаешь


Точно - точно. Когда с FoxPro работаешь, необходимо помнить про отсутствие ХП :)

почему Ораклы так обрабатывают NULL, но наверное не с бухты-барахты.

Ага. Для нарушения стандарта AnsiSQL, чтобы никто с Oracle к конкурентам не уходил :)

Я думаю, если бы они и захотели теперь это исправить, то всё равно не смогут, из-за нарушения совместимости с предыдущими версиями. Так что дело в исторических причинах. Хотя можно попытаться найти, какие отмазки официально использует Oracle :)


 
Sergey13 ©   (2006-09-29 10:39) [42]

> [41] Тугодум ©   (29.09.06 10:22)

Ты считаешь Ораклу нужны отмазки? Сомневаюсь.
Да и "проблема" то тонкая. Одно дело, ИМХО, 0 и NULL - 0 вполне определенное число как 1 или 837356. А вот "" это что? Пробел понятно - строка, а отсутствие строки как таковой, почему это нельзя интерпретировать как отсутствие данных, т.е. NULL?
Я не оправдываю и не защищаю Оракл за отход от теории (он и не нуждается в моей защите 8-), просто не считаю это таким уж страшным огрехом.

ЗЫ: Зато у Оракла есть connect by. 8-)


 
Тугодум ©   (2006-09-29 10:52) [43]

Sergey13 ©   (29.09.06 10:39) [42]

Вот тебе реальный пример. Есть БД зарегистрированных предприятий. Каждое предприятие, кроме корня наименования ("Чебурашка") еще может иметь префикс ("Акционерное общество") или постфикс ("Limited"). Естественно, полное наименование получается конкатенацией всех трех полей. Вопрос - нафига меня Oracle заставляет использовать функцию NVL (IsNull, Decode и т.д.), если на всех остальных СУБД я могу тупо написать без всяких дополнительных функций? На Oracle получается и медленнее, и геморройнее.
Oracle забирает у меня свободу выбора использовать пустую строку ради экономии одного бита на строковое поле. Естественно, кроме упрощения реализации хранения строк (в Oracle строковый NULL представляется пустой строкой, как я понимаю, в то время как прочие СУБД вынуждены использовать специальный флаг.

Хорошо, допустим, подход Oracle правильнее. Тогда почему числовой NULL в Oracle не представляется 0, а дата - 01.01.0001? :) Зачем вообще нужен NULL, если без него всегда можно обойтись? :)


 
k2 ©   (2006-09-29 10:56) [44]

>На Oracle получается и медленнее, и геморройнее.
select prefix_name||" "||name||]" "||postfix from
а причемтут функции?


 
Reindeer Moss Eater ©   (2006-09-29 11:04) [45]

select prefix_name||" "||name||]" "||postfix from
а причемтут функции?


Притом, что выражение будет пустым если одни хотя бы один из операндов пустая строка.


 
Тугодум ©   (2006-09-29 11:04) [46]

k2 ©   (29.09.06 10:56) [44]

Если в prefix_name пустая строка, то результатом будет не NULL?

То есть
select prefix_name возвращает "",
а where prefix_name="" равно false?

Если так, то это "можно только запомнить, потому что понять это невозможно" (с)
:)


 
Тугодум ©   (2006-09-29 11:06) [47]

Reindeer Moss Eater ©   (29.09.06 11:04) [45]

Притом, что выражение будет пустым если одни хотя бы один из операндов пустая строка.

А вот и проблема!!!

Кстати, я еще не понял - ""||"1" будет "1" или пустая строка?


 
k2 ©   (2006-09-29 11:13) [48]

CREATE TABLE T1
(
 P1  VARCHAR2(10 BYTE),
 P2  VARCHAR2(10 BYTE),
 P3  VARCHAR2(10 BYTE)
)

insert into t1 (p1, p2, p3) values(null, "колобок", null)

select p1||" "||p2||" "||p3 from t1

получаю колобка, или я неправильно понимаю?


 
Тугодум ©   (2006-09-29 11:15) [49]

k2 ©   (29.09.06 11:13) [48]

Ужас. Oracle must die.


 
k2 ©   (2006-09-29 11:16) [50]

Тугодум ©   (29.09.06 11:15) [49]
руки прочь от оракла :) он же тебе дает свободу выбора :) тебе же этого только што не хватало? :)))


 
pasha_golub ©   (2006-09-29 11:17) [51]


> k2 ©   (29.09.06 11:13) [48]

Это, мне кажется, специфика реализации. На других СУБД результат может быть другим.


 
Reindeer Moss Eater ©   (2006-09-29 11:21) [52]

Вру.
Конкатенация вернет "1" в обоих контекстах (и в SQL и PL/SQL)


 
k2 ©   (2006-09-29 11:24) [53]

pasha_golub ©   (29.09.06 11:17) [51]
а может и не быть :) в mssql вроде также, а больше я не знаю субд


 
Игорь Шевченко ©   (2006-09-29 11:26) [54]


> Это, мне кажется, специфика реализации. На других СУБД результат
> может быть другим.


В firebird результат равен NULL


 
vuk ©   (2006-09-29 11:30) [55]

to k2 ©   (29.09.06 11:24) [53]:
>в mssql вроде также
В mssql кокатенация с null дает null, конкутенация с пустой строкой отработает как и должна.


 
Тугодум ©   (2006-09-29 11:31) [56]

k2 ©   (29.09.06 11:16) [50]

Наоборот, я написал, что Oracle лишает свободы выбора. Я хочу различать NULL и пустую строку, а он не дает. К тому же нарушает главное правило NULL: любая операция с NULL должна в результате давать NULL.

Reindeer Moss Eater ©   (29.09.06 11:21) [52]

Понятно. То есть
field="" возвращает всегда false,
а NULL(записанный в БД)||"1" возвращает "1".

получается, что извращенцы из Oracle обменяли пустую строку и NULL...

Доктор сказал в морг - значит в морг...


 
k2 ©   (2006-09-29 11:32) [57]

vuk ©   (29.09.06 11:30) [55]
ну ошибочка вышла, не дают поумничать безнаказанно :) прошу прощения :)


 
Reindeer Moss Eater ©   (2006-09-29 11:34) [58]

Я хочу различать NULL и пустую строку, а он не дает.

Ну и кто из вас двоих (Oracle и ты) извращенец?

Как должна отличаться конкатенация непустой строки с нулом и конкатенация непустой строки с пустой строкой?


 
Sergey13 ©   (2006-09-29 11:35) [59]

> [56] Тугодум ©   (29.09.06 11:31)
> Доктор сказал в морг - значит в морг...
Бедный Оракл. Тут ему такие диагнозы ставят, а он и не знает.
Напиши гневное письмо им, пусть прочувствуют.
8-)


 
Игорь Шевченко ©   (2006-09-29 11:35) [60]

Тугодум ©   (29.09.06 11:31) [56]


> Oracle лишает свободы выбора


Погоду он тоже не предсказывает. Странно, да ? Вот бедные оракловские пользователи по всему миру живут и мучаются, лишенные свободы выбора. Мне их жаль, тебе тоже ?


 
k2 ©   (2006-09-29 11:37) [61]

Тугодум ©   (29.09.06 11:31) [56]
я не пойму о чем речь, null и пустая строка в оракле различаются, просто в случае операций со строками null неявно преобразуется в "", помоему наоборот удобно


 
Reindeer Moss Eater ©   (2006-09-29 11:38) [62]

я не пойму о чем речь, null и пустая строка в оракле различаются

Как раз таки нет. Не различаются.


 
Тугодум ©   (2006-09-29 11:44) [63]

Reindeer Moss Eater ©   (29.09.06 11:34) [58]

Извращенец именно Oracle. Потому что результат любой операции с NULL должен быть NULL. А Oracle почему-то смотрит на тип и если это строка, то он живенько заменяет NULL на пустую строку.

Sergey13 ©   (29.09.06 11:35) [59]

Мне пофиг. Я его не использую... пока :)


 
Тугодум ©   (2006-09-29 11:45) [64]

Игорь Шевченко ©   (29.09.06 11:35) [60]

Не надо за меня переживать. Если им нравится отходить от ANSI SQK - их личное дело. Ну и пользователей, конечно


 
Игорь Шевченко ©   (2006-09-29 11:48) [65]

Тугодум ©   (29.09.06 11:45) [64]

Кто же спорит - конечно их личное дело. И твое личное дело, ругать Оракл или не ругать, Ораклу-то на твою ругань все равно сверху...


 
Тугодум ©   (2006-09-29 11:48) [66]

Игорь Шевченко ©   (29.09.06 11:48) [65]

Как и мне на Ваше мнение :)


 
k2 ©   (2006-09-29 11:49) [67]

Reindeer Moss Eater ©   (29.09.06 11:38) [62]
ужас :(

Тугодум ©   (29.09.06 11:45) [64]
хочешь подкину дровишек? :)
insert into t1 (p1, p2, p3) values("", "чубурашка", null)

select case when p1 = "" then 1 when p1 is null then 2 end f1
 from t1
 
select case when p3 = "" then 1 when p3 is null then 2 end f1
 from t1


 
Sergey13 ©   (2006-09-29 11:50) [68]

> [63] Тугодум ©   (29.09.06 11:44)
> Я его не использую... пока :)
Тогда мне понятны твои возмущения. Скачай и юзай, даже можно бесплатно. 8-)


 
Reindeer Moss Eater ©   (2006-09-29 11:53) [69]

Потому что результат любой операции с NULL должен быть NULL.

Результат СРАВНЕНИЯ любого значения с null, а не результат ЛЮБОЙ операции вообще.


 
Тугодум ©   (2006-09-29 11:55) [70]

k2 ©   (29.09.06 11:49) [67]

2 будут?

Sergey13 ©   (29.09.06 11:50) [68]

Я возмущаюсь, потому что буду использовать. И теперь придется привыкать к тому, что SQL в Oracle не такой, как в других СУБД. Привыкну, конечно, но всё равно не слишком приятно.


 
Тугодум ©   (2006-09-29 11:56) [71]

Reindeer Moss Eater ©   (29.09.06 11:53) [69]

Сложения, вычитания, деления, умножения, но НЕ конкатенации.
Разве конкатенация перестала быть аналогом сложения?


 
k2 ©   (2006-09-29 12:00) [72]

Тугодум ©   (29.09.06 11:55) [70]  угу :)


 
Reindeer Moss Eater ©   (2006-09-29 12:05) [73]

Еще раз.
Результат любого сравнения. То есть любой логической опреации с нулом должен быть false.
Про другие опрерации с нулом ничего не сказано.


 
pasha_golub ©   (2006-09-29 12:07) [74]

В
> Игорь Шевченко ©   (29.09.06 11:26) [54]
>
>
>
> В firebird результат равен NULL
>


В PostgreSQL тоже NULL.


 
Игорь Шевченко ©   (2006-09-29 12:09) [75]

"Поскольку NULL не является, в общем смысле, значением, использование его в арифметических, строковых, логических и других операциях, строго говоря, некорректно. Тем не менее, большинство СУБД поддерживают такие операции, но вводят для них специальные правила:

NULL может присваиваться переменным и записываться в поля, независимо от объявленного типа данных этих переменных (полей);
NULL может передаваться в процедуры и функции как легальное значение параметра. Результаты выполнения такой процедуры или функции определяются операциями, выполняемыми с параметрами внутри неё.
Любая операция с NULL, кроме операции сравнения, в результате даёт NULL, независимо от значения прочих операндов.
Любая операция сравнения с NULL (даже операция «NULL = NULL») даёт в результате значение «логическая ложь» (FALSE).
Существует специальная системная функция или операция (обычно expr IS [NOT] NULL), возвращающая логическое значение «истина» (TRUE), если expr является NULL.
Кроме того, могут существовать специальные системные функции для удобного преобразования NULL к определённым значениям, например, в Oracle имеется системная функция NVL, которая возвращает значение своего параметра, если он не NULL, или значение по умолчанию, если операнд — NULL."

http://ru.wikipedia.org/wiki/NULL_%28SQL%29


 
Тугодум ©   (2006-09-29 12:13) [76]

Reindeer Moss Eater ©   (29.09.06 12:05) [73]

Помнится, нас учили, что РСУБД построены на основе какой-то там реляционной алгебры. Разве не оттуда ноги растут у единодушия разработчиков РУСБД по поводу того, сколько будет 2 + NULL * 15?


 
pasha_golub ©   (2006-09-29 12:24) [77]

NULL - есть NULL.

Это все равно, что сказать: "Плюс бесконечность минус бесконечность равно 0". Любой математик здравый в лицо может плюнуть.

Или из этой же серии: "Бесконечность деленная на бесконечность равна 1".


 
Тугодум ©   (2006-09-29 12:26) [78]

pasha_golub ©   (29.09.06 12:24) [77]

Нет, здравый не плюнет. Разве что пьяный :)


 
k2 ©   (2006-09-29 12:28) [79]

pasha_golub ©   (29.09.06 12:24) [77]
математика приложенная например к бухгалтерии принимает иногда такие извращенные формы :)


 
Игорь Шевченко ©   (2006-09-29 12:29) [80]

k2 ©   (29.09.06 12:28) [79]


> математика приложенная например к бухгалтерии принимает
> иногда такие извращенные формы


Там человек с фамилией ИТОГО больше всех получает


 
Romkin ©   (2006-09-29 12:31) [81]


> Любая операция сравнения с NULL (даже операция «NULL = NULL»)
> даёт в результате значение «логическая ложь» (FALSE).

Ой-ой. Это не так. Результатом является unknown, но никак не false. Это - разные вещи. Если бы результат был false, то not (A = NULL) должна была бы давать True. А это жестоко.


 
Reindeer Moss Eater ©   (2006-09-29 12:36) [82]

Нет, здравый не плюнет. Разве что пьяный :)

Здравый смысл говорит, что если не делать различий между пустой строкой и нулом, то и конкатенировать нулл со строкой надо как пустую строку со строкой.
Если же платформа различает нулл и пустую строку, то можно из пижонства при складывании строки с нулом возвращать нулл.
Потому что это будет не одно и то же что и конкатенация с пустой строкой.

А различий действительно нет.
В силу специфики символьного типа. Если бы существовали числовые типы нулевой длины, с ними была та же самая песня.


 
Тугодум ©   (2006-09-29 12:37) [83]

Romkin ©   (29.09.06 12:31) [81]

Результатом является unknown, но никак не false

Null и есть unknown.
Так и вижу:
IF (((Field = NULL) = NULL ) =NULL)...

:)


 
Тугодум ©   (2006-09-29 12:40) [84]

Reindeer Moss Eater ©   (29.09.06 12:36) [82]

Здравый смысл говорит, что между неизвестным значением и пустой строкой есть разница. Пустая строка не представляет собой ничего необычного. Например, length("")=0, upper("")="" и т.д. length(Null)=?


 
Romkin ©   (2006-09-29 12:41) [85]


> Null и есть unknown.

Нет. Это разные понятия.


 
pasha_golub ©   (2006-09-29 12:44) [86]


> Тугодум ©   (29.09.06 12:40) [84]


> Здравый смысл говорит, что между неизвестным значением и
> пустой строкой есть разница.


Поддерживаю.


 
Тугодум ©   (2006-09-29 12:47) [87]

Romkin ©   (29.09.06 12:41) [85]

По-моему, unknown представляется с помощью специального значения, обозначаемого NULL. Особенно это верно для логических типов данных.


 
Reindeer Moss Eater ©   (2006-09-29 12:48) [88]

Пустая строка не представляет собой ничего необычного.

Попробуй передать её по каналам связи. Скажем через WriteBuffer.
И заодно принять её.

Пустая строка - это отсутствие строки. И только благодаря некоторым языкам создалось ошибочное представление, что это  такая же полноценная строка как и любая другая.

А это всего лишь иллюзия. Если бы строка была, ее можно было бы передать на носителе. И посчитать сколько всего таких строк уместилось на носитель. И сколько таких строк еще поместится на этом носителе.

Кто здесь сможет сказать определенно сколько пустых строк в моем сообщении после последней точки? Слабо? пустая строка это и есть NULL!
.


 
Alx2 ©   (2006-09-29 12:55) [89]

>Reindeer Moss Eater ©   (29.09.06 12:48)

>Пустая строка - это отсутствие строки.

Ну, в матчасти совсем по-другому написано. :) см. Теория множеств.  Реляционная алегба.


 
Тугодум ©   (2006-09-29 12:56) [90]

Reindeer Moss Eater ©   (29.09.06 12:48) [88]

Попробуй передать её по каналам связи. Скажем через WriteBuffer.
И заодно принять её.


Это детали реализации. Никто не мешает кроме указателя на начало данных передавать и длину данных, а не ориентироваться по байту со специальным значением.

Пустая строка - это отсутствие строки

и она же строка с нулевой длиной? В любом случае, ориентироваться нужно не на отсутствие, а на неизвестность. Отсутствие денег - это нуль, а не неизвестность.

Если бы строка была, ее можно было бы передать на носителе.

Да передавайте на здоровье. Сначала длину, потом каждый символ, если понадобится.

Кто здесь сможет сказать определенно сколько пустых строк в моем сообщении после последней точки? Слабо? пустая строка это и есть NULL!

Не слабо. Если бы Вы спросили "сколько неизвестных строк?", я бы ответил 0.
А спрашивать сколько незначащих нулей не записано слева и справа (после запятой) от числа "1" не имеет большого смысла. Потому что ответ - Unknown, NULL :)


 
Reindeer Moss Eater ©   (2006-09-29 12:57) [91]

Пусть эта матчасть ответит, сколько пустых строк я навставлял после последнй точки предудущего сообщения.

С точностью хотя бы плюс/минус миллиард.


 
Romkin ©   (2006-09-29 13:00) [92]

Reindeer Moss Eater ©   (29.09.06 12:48) [88]
Вот тебе пустые строки:

И можно посчитать.
Если в поле записано значение NULL - то это отсутствие значения. Если пустая строка - значение есть. И здесь есть разница: NULL в поле может означать как отсутствие информации, так и неприменимость. А если значение есть - значит, оно применимо :)


 
k2 ©   (2006-09-29 13:01) [93]

примерно столько же сколько и null"ов


 
Reindeer Moss Eater ©   (2006-09-29 13:02) [94]

И можно посчитать.

Ага. Щаз. Можно посчитать CRLF.
А я прошу сказать сколько я вставил пустых строк, а не CRLF"ов


 
Alx2 ©   (2006-09-29 13:02) [95]

>Reindeer Moss Eater ©   (29.09.06 12:57)

Это не к матчасти, а к психиатру :)

А на объяснение свойств пустого множества как-то разоряться не хочется :)


 
pasha_golub ©   (2006-09-29 13:21) [96]


> Reindeer Moss Eater ©   (29.09.06 13:02) [94]

По вашему нужно из теории алгебры выкинуть понятие нейтрального элемента относительно бинарной операции?

Например, 1*3*1 = 3, хоть сколько раз не умнажай на 1. Так давайте ее нафиг выкинем, зачем нам этот цирк? С нулем поступим также.

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


 
Reindeer Moss Eater ©   (2006-09-29 13:22) [97]

А на объяснение свойств пустого множества как-то разоряться не хочется :)

Пока никто и не просил разоряться на тему множеств.

Пока что просили ответить, есть в сообщении пустые строки или нет их.
Если манипулировать длинами всех строк сообщения, то получается, что исследуемый объект одновременно присутствует и отсутствует в сообщении.

То есть никто не может определенно сказать сколько там пустых строк.
Более того, никто не может сказать, что есть ли там хотя бы одна пустая строка вообще.

Ну и кто после этого логичнее обходится с нулом?
Фрэнк Борланд или Ларри Элиссон?


 
pasha_golub ©   (2006-09-29 13:31) [98]


> То есть никто не может определенно сказать сколько там пустых
> строк.
> Более того, никто не может сказать, что есть ли там хотя
> бы одна пустая строка вообще.
>


4=2*2=2*2*1=1*1*1*2*2=2*1*2*1=...

Сколько таких представлений числа?


 
k2 ©   (2006-09-29 13:32) [99]

все больше напоминает спор остроконечников и тупоконечников %)


 
Reindeer Moss Eater ©   (2006-09-29 13:33) [100]

Цифры то здесь при чем?

По вашему нужно из теории алгебры выкинуть понятие нейтрального элемента относительно бинарной операции?

да я вообще таких трудных слов не знаю. :)
Это не мое мнение, это чья-то неудачная догадка.


 
Alx2 ©   (2006-09-29 13:33) [101]

>Reindeer Moss Eater ©   (29.09.06 13:22)

Ну хорошо.
Следующее утверждение справедливо: во всякой строке содержится одна пустая строка :)
Более того:
Во всякой строке содержится счетное множество пустых строк.


 
pasha_golub ©   (2006-09-29 13:36) [102]


> k2 ©   (29.09.06 13:32) [99]
>
> все больше напоминает спор остроконечников и тупоконечников
> %)
>

Угу, и не подумал бы, что есть такая тема для священной войны. :0)


 
Reindeer Moss Eater ©   (2006-09-29 13:36) [103]

>все больше напоминает спор остроконечников и тупоконечников %)

спор вполне конкретен.
Спорят о том, кто более последователен в обращении с нулом. Оракл или остальные.

Оракл совершенно справдедливо считает, что строка нулевой длины эквивалента нулу.
И правильно делает.
/* Потому что я тоже так считаю :) */


 
MOA ©   (2006-09-29 13:36) [104]

Вас не настораживает, что в любом языке тип данных "строка" как-то маркируется (длиной или стоп символом) - так всегда можно сказать сколько именно строк даже и пустых. И как следсвие всегда отличить пустую строку от её, строки, полного отсутствия?


 
pasha_golub ©   (2006-09-29 13:39) [105]


>
> Reindeer Moss Eater ©   (29.09.06 13:33) [100]
>
> Цифры то здесь при чем?
>


Ну как это при чем? Мы рассуждаем об алгебре. Множество есть, бинарная операция на нем задана, нейтральный элемент присутствует. По-моему, все честно.


 
kaif ©   (2006-09-29 13:56) [106]

Вопросец.
Если ORACLE отличает пустые строки от NULL при хранении, но не отличает в каких-то иных случаях, то что должен вернуть такой запрос?

SELECT F1, COUNT(*)
FROM T1
GROUP BY F1

?

Вот Firebird вернет, допустим:


"Вася"   15
"Петя"   4
""         50
null      18


А что вернет ORACLE?


 
Игорь Шевченко ©   (2006-09-29 14:08) [107]

kaif ©   (29.09.06 13:56) [106]


> А что вернет ORACLE?


Пустую строку и count (в SQL*Plus)


 
Reindeer Moss Eater ©   (2006-09-29 14:19) [108]

А что вернет ORACLE?

Вернет все то, что и должен вернуть.

Случай с count(*) оговорен в SQL специально
Он считает не значения, а строки.

То есть  для таблицы где два Васи, два Пети и два нула
будет такой результат

Вася 2
Петя 2
нулл 2


 
Reindeer Moss Eater ©   (2006-09-29 14:20) [109]

Ну как это при чем? Мы рассуждаем об алгебре.

рассуждайте о чем хотите. Я рассуждаю о нулл и пустой строке.


 
kaif ©   (2006-09-29 14:23) [110]

Это означает, что ORACLE просто отождествляет "пустую строку" и NULL.

Так как в тексте запроса я нигде не использовал операндов, которые нужно было бы как-то еще интерпретировать "в процессе парсинга текста запроса".

Вот если бы я написал

insert into T1(F1) values ("")

то еще можно было бы допустить, что клиент ORACLE или кто-то еще по пути не отличает, что я хочу вставить именно пустую строку (пусть даже по своим, ORACLE-а, соображениям).

но то, что простой запрос с группировкой не различает пустые строки и null - это уже существенный момент.

Можно этому радоваться или возмущаться, но теперь это так.
Я понимаю, что пользователям это удобнее.

Тогда следующий вопрос.

Допустим поле F1 определено как NOT NULL.

И я делаю две вставки:

insert into T1(F1) values ("")

и

insert into T1(F1) values (NULL)

Зная уже про запрос с группировкой и его результаты, мне будет очень странно видеть, что одна команда прошла, а другая - нет.

Так как со вставкой значения NULL в строковое поле NOT NULL дело обстоит?

Просветите, знатоки ORACLE.


 
Игорь Шевченко ©   (2006-09-29 14:27) [111]

kaif ©   (29.09.06 14:23) [110]

> insert into T1(F1) values ("")


Ошибка будет. ORA-01400


> Зная уже про запрос с группировкой и его результаты, мне
> будет очень странно видеть, что одна команда прошла, а другая
> - нет.


Это неверное утверждение


 
k2 ©   (2006-09-29 14:27) [112]

kaif ©   (29.09.06 14:23) [110]
нельзя вставить в обоих случаях


 
Reindeer Moss Eater ©   (2006-09-29 14:28) [113]

Это означает, что ORACLE просто отождествляет "пустую строку" и NULL.

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

И стало так.
Все посмотрели на числовой тип, на весь его диапазон, и поняли, что ни одно значение из диапазона не эквивалентно нулу. И ввели отдельный специальный нул.
То  же самое сделали со строковым типом.
А Оракл был умнее и смог рассмотреть в значении строкового типа "пустая строка" эквивалент нул. И не ввел спец значения нула, отличающегося от пустой строки.


 
pasha_golub ©   (2006-09-29 14:28) [114]


> kaif ©   (29.09.06 14:23) [110]


> Допустим поле F1 определено как NOT NULL.
>
> И я делаю две вставки:
>
> insert into T1(F1) values ("")
>
> и
>
> insert into T1(F1) values (NULL)
>


Вот, вот. Очень показательный момент. Спасибо, я как-то сразу в сторону NOT NULL constraint"ов не посмотрел.


 
pasha_golub ©   (2006-09-29 14:31) [115]

Эк, однако. Не все так просто. Ужасть.


> А Оракл был умнее и смог рассмотреть в значении строкового
> типа "пустая строка" эквивалент нул. И не ввел спец значения
> нула, отличающегося от пустой строки.

Чаще важнее следовать стандарту. БЫло бы по стандарту отождествление, нет вопросов.


 
Тугодум ©   (2006-09-29 14:31) [116]

Reindeer Moss Eater ©   (29.09.06 14:20) [109]

Empty string
Oracle treats the empty string ("") as null. This is not ansi compliant. Consequently, the length of an emtpy string is null, not 0.

http://www.adp-gmbh.ch/ora/misc/null.html

In Oracle 8, there is no such thing as a zero-length string. Any zero-length string, either from a function call or the literal "", is treated as null.

Some of the consequences of this are counterintuitive. Here are some examples.

The expression X="" is never true, regardless of what X is. In particular:
The expression ""="" is not true.
If you store an empty string ("") and read it back, the result will be null.
The expression trim(‘ ‘) returns null.
Be careful of this when writing your queries, particularly if you are porting code between Oracle and another database.


http://www.thunderguy.com/semicolon/2003/04/26/oracle-empty-string-null/

Круто, неправда ли? Trim("                 ") возвращает NULL :)


 
Reindeer Moss Eater ©   (2006-09-29 14:32) [117]

Так как со вставкой значения NULL в строковое поле NOT NULL дело обстоит?

Не вставит.


 
Reindeer Moss Eater ©   (2006-09-29 14:33) [118]

Круто, неправда ли? Trim("                 ") возвращает NULL :)

И чего?
Какие опасения?
Это как-то отличается от того, если бы трим вернул пустую строку?
Как именно?
Найдите 10 отличий.
Или хоть одно


 
k2 ©   (2006-09-29 14:35) [119]

pasha_golub ©   (29.09.06 14:31) [115]
стандарт тоже не из головы бога создан, люди писали, может лучше было стандарт привести к оракловому видению null"а? :)


 
Игорь Шевченко ©   (2006-09-29 14:35) [120]

Тугодум ©   (29.09.06 14:31) [116]
pasha_golub ©   (29.09.06 14:31) [115]

Ну не используйте Оракл, нехай Ларри Элиссон обеднеет :) Так ему, буржую, и надо.


 
MsGuns ©   (2006-09-29 14:50) [121]

NULL - это вообще нечто, своего рода артефакт. Только в отличие от настоящего артефакта, не имеющего объяснимого с т.зр. науки способа происхождения, это артефакт вполне "доморощенный".
Точку зрения Уракла понять можно:
С позиции семантики пустая строка, т.е. "" - то же самое, что и неизвестная, например, дата. Или число (сумма). Именно ТО ЖЕ САМОЕ. Ибо пустой текст совершенно аналогичен его полному отсутствию.
Другое дело, что ни Уракл, ни ИБМ, ни другие "монстеры жанра" не удосужились за полвека (если не больше) собраться вместе за круглым столом (пусть даже уставленным бутылками) и договориться

ЧТО СЧИТАТЬ УНИВЕРСАЛЬНЫМ ПРИЗНАКОМ ОТСТУТСТВИЯ ИНФОРМАЦИИ В БАЗАХ ДАННЫХ ?

Это тем более актуально, если вспомнить физическую сущность технологии хранения информации на "машинных носителях", которая, как известно, не может допустить "полное отсутствие" вообще чего бы то ни было. Ибо есть понятие "Есть сигнал" и есть понятие "Нет сигнала", но нет понятия "а фиг его знает, то ли есть сигнал, то ли его нет".

Однако NULL - это вовсе даже не проблема SQL, а так, мелочь пузастая по сранению с многообразием хранения, представления и интерпретации данных разных типов.  

Кстати:
Вот кто мне красиво и убедительно, к примеру, объяснит, к в памяти (например, в объекте типа записи) сохранить отсутствующую дату или число ?
Интим вроде использования признаков или флажков не предлагать.


 
Тугодум ©   (2006-09-29 14:52) [122]

Reindeer Moss Eater ©   (29.09.06 14:33) [118]

Вы, конечно, привыкли, а для меня вот это дико:

Let S = "A              B";
Let S = Replace(S, 1, " ");
Let S = Replace(S, Length(S), " ");
Let S = Trim(S);
// опа, в TrimS уже NULL


k2 ©   (29.09.06 14:35) [119]

Начинаю понимать, почему Oracle называется так, как он называется :)


 
Игорь Шевченко ©   (2006-09-29 14:57) [123]

MsGuns ©   (29.09.06 14:50) [121]


> Другое дело, что ни Уракл, ни ИБМ, ни другие "монстеры жанра"
> не удосужились за полвека (если не больше) собраться вместе
> за круглым столом (пусть даже уставленным бутылками) и договориться
>


У тебя ложные сведения.


 
Reindeer Moss Eater ©   (2006-09-29 15:00) [124]

// опа, в TrimS уже NULL

Дык я не понял, в чем проблема-то?
Результат - строковый тип.
Результат - правильный.
результат можно использовать в опреациях со строками и получить верный результат.

Что здесь такого непривычного?


 
MsGuns ©   (2006-09-29 15:00) [125]

Кстати, в уракловской "странности" интерпретировать NULL строковых доменов как <пусто> видится намного больше суконно-сермяжной правды, чем тупой "пошел на .." скалы или бэйза. В самом деле, только он вернет мне Сидорова Ивана без Отчества в результате простого, как горшок сиквеля Select Fam+" "+Nam+" "+Nam2
Ну НЕИЗВЕСТНО его отчество !
Так что в результате ? Получить ентот самый нул или загромождать запросы инсинуациями типа IIF/CASE ?
Причем в данном контексте, уважаемые коллеги, НИ В КОЕМ СЛУЧАЕ НЕЛЬЗЯ В ОТЧЕСТВО ПИСАТЬ ПУСТО. Потому что есть полные имена без отчеств. ЕСТЬ ! А есть люди с НЕИЗВЕСТНЫМ отчеством. И это суть совершенно разные понятия.


 
Игорь Шевченко ©   (2006-09-29 15:03) [126]

MsGuns ©   (29.09.06 15:00) [125]


> А есть люди с НЕИЗВЕСТНЫМ отчеством.


Это как ? :)


 
Тугодум ©   (2006-09-29 15:03) [127]

Reindeer Moss Eater ©   (29.09.06 15:00) [124]

Для Вас - ничего непривычного.


 
Reindeer Moss Eater ©   (2006-09-29 15:04) [128]

> А есть люди с НЕИЗВЕСТНЫМ отчеством.

Это как ? :)

<Цитата>

Паспорт сжег, и никому не говорит кто-бы ни справшивал.
:)


 
Reindeer Moss Eater ©   (2006-09-29 15:05) [129]

Для Вас - ничего непривычного.

Мне интересно что здесь непривычного для вас.


 
Romkin ©   (2006-09-29 15:05) [130]

Reindeer Moss Eater ©   (29.09.06 15:00) [124] Угу. Взяли строку, отрезали пробелы (или поменяли), и попытались вставить в столбец not NULL. Получили отлуп...
Занятно, а что с char? Там же вроде пробелы всегда должны быть. Если я взял, записал 30 пробелов в char(30), а потом присвоил это varchar(30), что тоже NULL будет?


 
Тугодум ©   (2006-09-29 15:06) [131]

MsGuns ©   (29.09.06 15:00) [125]

Если так хочется обходиться без проверок, ставьте констрейнт NOT NULL. Тем более, раз уж всё равно в поле записываете пустую строку, а не NULL.

Причем в данном контексте, уважаемые коллеги, НИ В КОЕМ СЛУЧАЕ НЕЛЬЗЯ В ОТЧЕСТВО ПИСАТЬ ПУСТО. Потому что есть полные имена без отчеств. ЕСТЬ ! А есть люди с НЕИЗВЕСТНЫМ отчеством. И это суть совершенно разные понятия.

Разные-то они разные, только вот после записи в БД уже невозможно узнать, а что там было. То есть Ваша идея не работает.


 
Reindeer Moss Eater ©   (2006-09-29 15:07) [132]

Угу. Взяли строку, отрезали пробелы (или поменяли), и попытались вставить в столбец not NULL. Получили отлуп...

Отлуп получили правильно.
Если ещ епри этом и уметь ообрабатывать отлупы, то в итоге получим то, чего хотели - в поле будет именно то, чего нам надо было.


 
evvcom ©   (2006-09-29 15:28) [133]

> [38] Внук ©   (29.09.06 09:22)

Ну да, согласен. Оракловая фича. :)

> [40] Sergey13 ©   (29.09.06 09:59)
> Х.З. почему Ораклы так обрабатывают NULL

Имхо, для оптимизации. null физически не хранится.

> [41] Тугодум ©   (29.09.06 10:22)
> Для нарушения стандарта AnsiSQL, чтобы никто с Oracle к
> конкурентам не уходил :)

2 раза ГЫ. :) Они, кстати, и не заявляют, что от стандарта ни на шаг. Так что хозяин-барин. Привычки можно исправить, а жертвовать скоростью, ради стандарта... Вот и забили они здесь на стандарт.

> [42] Sergey13 ©   (29.09.06 10:39)
> ЗЫ: Зато у Оракла есть connect by. 8-)

Эт точно! (с) Сухов

> [43] Тугодум ©   (29.09.06 10:52)
> Oracle заставляет использовать функцию NVL

Мишель, не пори муру (с) песТня

> [45] Reindeer Moss Eater ©   (29.09.06 11:04)

Здесь ты не прав.

> [48] k2 ©   (29.09.06 11:13)

Зачем такой сложный пример? Достаточно
select null || "колобок" || null from dual
получишь колобка

> [49] Тугодум ©   (29.09.06 11:15)

Ты опять не прав.

> [56] Тугодум ©   (29.09.06 11:31)
> Я хочу различать NULL и пустую строку

"Хочу" и "надо" немного разные понятия. :)

> получается, что извращенцы из Oracle

Сам ты извращенец. Напиши свою СУБД. Она, наверное, получится круче. :-)

> [64] Тугодум ©   (29.09.06 11:45)
> Если им нравится отходить от ANSI SQK

А это что за зверь? :-)

> [70] Тугодум ©   (29.09.06 11:55)
> И теперь придется привыкать к тому, что SQL в Oracle не
> такой, как в других СУБД

Ага, а в других СУБД он везде одинаков? Ты их все знаешь? Да ты полиглот! Пойди проспись.

> [80] Игорь Шевченко ©   (29.09.06 12:29)
> Там человек с фамилией ИТОГО больше всех получает

Вот думаю, мож фамилию сменить? :-)
Фу, устал читать...


 
k2 ©   (2006-09-29 15:32) [134]

>Зачем такой сложный пример? Достаточно
select null || "колобок" || null from dual
получишь колобка
угу, а потом вытерпеть холивар откуда и чего берется и кладется в dual :)
тоже фича :)


 
Тугодум ©   (2006-09-29 15:33) [135]

evvcom ©   (29.09.06 15:28) [133]

Хорошо, что ты устал читать.
Да, я полиглот. Я могу работать с любой СУБД, которая поддерживает Ansi SQL. Ну что, начинать перечислять MSSQL, Informix, Paradox, ForPro и прочее, к чему я когда-либо писал запросы?


 
evvcom ©   (2006-09-29 15:43) [136]

> [126] Игорь Шевченко ©   (29.09.06 15:03)

А это, когда даже мама не знает, кто папа. :)

> [125] MsGuns ©   (29.09.06 15:00)

Ну так ты в этом посте "за" или "против"? Я что-то не понял... :)
Да и какая собственно разница в двух записях:
Иванов Иван
Абдурахман ибн Ямин Папуас Оглы
пустое там отчество или неизвестное?

> [130] Romkin ©   (29.09.06 15:05)

пробел это не null, вот если TRIM(" "), тогда null


 
evvcom ©   (2006-09-29 15:57) [137]

> [134] k2 ©   (29.09.06 15:32)

Уже давно перешли на оракла, потому каждый мал мальски знакомый с ним должен знать про dual :)

> [135] Тугодум ©   (29.09.06 15:33)
> Я могу работать с любой СУБД, которая поддерживает Ansi SQL

Качественная и эффективная работа с СУБД не ограничивается умением писать только селекты и апдейты.


 
k2 ©   (2006-09-29 16:02) [138]

evvcom ©   (29.09.06 15:57) [137]
хорошо, обещаю больше никаких сложных примеров :)


 
wal ©   (2006-09-29 16:07) [139]


> [137] evvcom ©   (29.09.06 15:57)
> Уже давно перешли на оракла, потому каждый мал мальски знакомый
> с ним должен знать про dual :)
А в форуме сидят исключительно те, кто ... (см. выше)


 
pasha_golub ©   (2006-09-29 16:34) [140]

A dual по-моему даже в стандартах употребляется? Нет? Я где-то встречал, только вот фиг вспомню где.


 
MsGuns ©   (2006-09-29 17:38) [141]

>evvcom ©   (29.09.06 15:43) [136]
>Ну так ты в этом посте "за" или "против"? Я что-то не понял... :)

Я как большинство !  ;))
А если серьезно, то в данном контексте (интерпретации нула для строковіх колонок как "пусто") я - за уракл. А вообще против. Как баба Яга ;))


 
kaif ©   (2006-09-29 17:58) [142]

2 MsGuns ©   (29.09.06 15:00) [125]

Мне вполне понятна точка зрения ORACLE считать отсутствие текста неопределенным текстом.
Это действительно иногда удобно.

Однако вот мне так кажется (возможно я и неправ - настаивать не буду), что пустая строка и "строка из десяти пробелов" в этом смысле совершенно философски не отличаются.
Так почему ORACLE считает строку пробелов информативным текстом? Ведь "глазами" юзер все равно не отличит строку пробелов от пустой строки.


 
kaif ©   (2006-09-29 18:00) [143]

Если строка из трех пробелов несет информацию "здесь 3 символа", то пустая строка несет информацию "здесь 0 символов". А Null - когда строка не несет вообще никакой информации.


 
kaif ©   (2006-09-29 18:07) [144]

Лучше вместо "несет" употребить слово "содержит".

Итак, пустая строка (ИМХО) философски содержит информацию о том, что в строке имеется 0 символов.
А строка со значением NULL не содержит никакой информации.

ИМХО философски юзать одинаковым образом то, что содержит информацию и то, что таковой не содержит, означает всегда действовать с оглядкой на эту реализацию, и уже вовсе не полагаться на те теоремы и выводы, которые содержатся в реляционной теории.

А удобно многое...

Например кому-то удобно, что в интерпретаторах переменные не имеют типизации. Зато потом кто-то, возможно, потерял целый день на поиск неожиданно вылезшего бага, хотя 10 лет все "работало как часы".

А говорить, что каждый раз возиться с NULL в лом - то же самое, как говорить, что каждый раз объявлять переменные в типизированных языках кому-то в лом. Мне - не в лом, например.


 
Внук ©   (2006-09-29 18:27) [145]

>>kaif ©
 Согласен


 
Reindeer Moss Eater ©   (2006-09-29 22:05) [146]

Ну а как насчет прикола с передачей этого значения в носитель?


 
DiamondShark ©   (2006-09-30 10:53) [147]


> Reindeer Moss Eater ©   (29.09.06 13:33) [100]
> Цифры то здесь при чем?

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


> Reindeer Moss Eater ©   (29.09.06 22:05) [146]
> Ну а как насчет прикола с передачей этого значения в носитель?

Точно так же, как с числом 1.
Можно записать один бит, можно -- сорок байт. И всё это будет представлением числа 1 в какой-то конкретной физической реализации.

Если до тебя разница между абстракцией "число" (строка, множество, итп итд) и физ. представлением не доходит -- убей себя ап стену.
Ну или хотя бы к компу больше не подходи.


 
euru ©   (2006-09-30 11:29) [148]


> Reindeer Moss Eater ©   (29.09.06 22:05) [146]
> Ну а как насчет прикола с передачей этого значения в носитель?
http://www.mysql.ru/docs/man/Problems_with_NULL.html:

Концепция NULL-значения часто вводит в заблуждение новичков в SQL, которые считают, что NULL - то же, что и пустая строка "". Это ошибка! Например, следующие команды совершенно различны:

mysql> INSERT INTO my_table (phone) VALUES (NULL);
mysql> INSERT INTO my_table (phone) VALUES ("");

Обе команды вставляют значение в столбец phone, но первая - значение NULL, а вторая - пустую строку. Смысл первого можно передать как "номер телефона неизвестен"", смысл второго - "у нее нет телефона"".

При чтении данных с помощью LOAD DATA INFILE пустые поля обновляются значениями "". Если необходимо поместить в столбец значение NULL, то в текстовом файле следует использовать \N. Также при некоторых обстоятельствах можно использовать слово-литерал NULL (see section 6.4.9 Синтаксис оператора LOAD DATA INFILE).


 
Reindeer Moss Eater ©   (2006-09-30 13:33) [149]

DiamondShark ©  

Ну и при чем здесь извращенная физическая реализация?
Неужели так трудно понять о чем я?

Есть строковый тип и у него есть уже физическая реализация.
Мне говорят, что пустая строка - это такое же полноценное значение строкового типа как и любое другое.
Я говорю, замечательно!
Как мне передать это полноценное значение по медиа?
Все молчат или придумывают новую физическую реализацию для этого значения.

А я утверждаю, что это значение и есть полный эквивалент NULL!
То есть нет никакого значения или значение не определено!

Если оно есть, передайте его в сообщении. Причем так, что бы можно было с определенностью сказать есть там ваша пустая строка или нет. И если есть, то сколько именно.

Если это такое же равноправное значение типа как и все остальные строки.


 
Danilka ©   (2006-10-02 08:32) [150]

[148] euru ©   (30.09.06 11:29)
Глупости!
Это у кого, в наше время, нет телефона, а?
:)


 
Sergey13 ©   (2006-10-02 09:02) [151]

Почему то никого не возмущает тот факт, что все СУБД отбрасывают хвостовые пробелы в varchar-е. Ведь номинально есть разница между "строка" и "строка       ". Однако если отбросить "строка" сразу возникают непримиримые противоречия. 8-)
ЗЫ: А для любителей "точности" есть CHAR. 8-)


 
evvcom ©   (2006-10-02 09:40) [152]

> [148] euru ©   (30.09.06 11:29)
> Смысл первого можно передать как "номер телефона неизвестен"",
> смысл второго - "у нее нет телефона"".

Тогда первое надо поделить еще на 2:
1. телефон есть, но неизвестен
2. неизвестно вообще, есть ли телефон, и сколько их.
:-)
Если нужны (ну просто жить без них кто-то не может) подобные флаги/понятия, можно явно ввести поле для такого флага.
Еще, если точно известно, что телефона нет, достаточно (и вроде обычно так и делают) поставить прочерк "-". Оно и на печати будет различимо. А различимые в sql null и "" (не Оракл) на печати один фиг не различишь. Да и в компонентах ввода, DBEdit к примеру, как их различить?


 
euru ©   (2006-10-02 10:09) [153]


> Reindeer Moss Eater ©   (30.09.06 13:33) [149]
>Если оно есть, передайте его в сообщении. Причем так, что бы можно
> было с определенностью сказать есть там ваша пустая строка
> или нет. И если есть, то сколько именно.

А как в Вашем случае передаётся пустая строка? Мне известно два варианта:
1. Передать в строке некий символ, информирующий, что это пустая строка. Чаще всего в качестве такого символа используется символ 0x00. Хотя, в принципе, ничто не мешает вместо него использовать какой-либо другой символ или даже их комбинацию. Но, согласитесь, пустая строка, содержащая символ (хотя бы один) уже не является пустой строкой.
2. Передать дополнительную информацию, сообщающую, что в строке нет символов. Чаще всего в качестве такой информации используется длина передаваемой строки, хотя можно использовать, например, некий флаг, сообщающий, что строка пустая. В данном варианте физическая реализация передаёт вообще не строку, а информацию о ней.

В любом случае между передающей и принимающей сторонами должно быть соглашение, как правильно интерпретировать поток данных, чтобы корректно определить пустые строки. В противном случае клиентская сторона так и не узнает, что ей передавали пустые строки.

Так почему если для передачи пустых строк используется дополнительная информация, то таким же способом нельзя передать NULL?


 
euru ©   (2006-10-02 10:24) [154]


> Danilka ©   (02.10.06 08:32) [150]
> [148] euru ©   (30.09.06 11:29)Глупости!Это у кого, в наше
> время, нет телефона, а?:)

Наверно, в то время когда писалась эта документация, такая ситуация была распространённой. Можно предложить авторам обновить документацию с учётом современных реалий. Например, вместо "номера телефона" использовать "серийный номер автомата Калашникова". Думаю, ещё не скоро наступят времена, когда у всех в качестве обязательного аксессуара будет сей предмет. :)


> evvcom ©   (02.10.06 09:40) [152]
> Еще, если точно известно, что телефона
> нет, достаточно (и вроде обычно так и делают) поставить
> прочерк "-". Оно и на печати будет различимо.

Ага, в поле типа NUMERIC вписать "-".


> А различимые в sql null и "" (не Оракл) на печати один фиг не различишь.
>  Да и в компонентах ввода, DBEdit к примеру, как их различить?

А собственно NULL не для того вводили, чтобы его правильно на печати или в компонентах ввода различать.


 
evvcom ©   (2006-10-02 10:42) [155]

> [154] euru ©   (02.10.06 10:24)
> Ага, в поле типа NUMERIC вписать "-".

Речь идет о varchar/varchar2

> А собственно NULL не для того вводили, чтобы его правильно
> на печати или в компонентах ввода различать

Угу, догадываюсь. :) Речь не о том.


 
Danilka ©   (2006-10-02 10:46) [156]

[154] euru ©   (02.10.06 10:24)
В поле для ввода серийника АК писать: "оказываецца сообщать!", все равно поле текстовое. :)
А если нумерик, то у Оракла нулл в таких полях ничем не отличается от других СУБД. :)


 
Игорь Шевченко ©   (2006-10-02 10:50) [157]

Смех смехом, но мне за все время программирования с использованием СУБД не приходилось сталкиваться с задачами, где естественным образом требуется отличать NULL от пустой строки, кроме искусственных приемов, которые обычно были трудно сопровождабельны. Я 23 года жил не так ?


 
Sergey13 ©   (2006-10-02 10:58) [158]

> [157] Игорь Шевченко ©   (02.10.06 10:50)

Ага, теперь тебе будет стыдно за "бесцельно прожитые годы". 8-)

А если серьезно, то проблема как раз наоборот, скорее есть тогда когда "" и NULL различны, ибо надо всегда делать 2 проверки вместо одной.


 
ANB ©   (2006-10-02 10:59) [159]


> с использованием СУБД не приходилось сталкиваться с задачами,
>  где естественным образом требуется отличать NULL от пустой
> строки

Эхм. После оракла в FB я с такой проблемой столкнулся. А NVL в FB нету. :(


> что все СУБД отбрасывают хвостовые пробелы в varchar-е

Странно. А оракл не отбрасывает. Может он не СУБД ?


 
pasha_golub ©   (2006-10-02 11:01) [160]


> Игорь Шевченко ©   (02.10.06 10:50) [157]
>


Не знаю есть ли такое в Оракле, но уверен, что есть. Пример из PostgreSQL:

Создаем Foreign Key по нескольким колонкам и указываем, допустим MATCH SIMPLE:


FOREIGN KEY ( column1 [, ... ] ) REFERENCES reftable [ ( refcolumn1 [, ... ] ) MATCH SIMPLE


В этом случае "MATCH SIMPLE allows some foreign key columns to be null while other parts of the foreign key are not null".

Однако, пустую строку сюда уже никаким образом не впихнуть.


 
ANB ©   (2006-10-02 11:03) [161]

В нескольких конторах, где я работал, нуллы старательно давили (кстати, запросы писать действительно проще). Т.е. во все справочники был добавлен нулевой элемент, в нынешней - в варчары пишут chr(1) (жутко непрывично, я все время забываю об этой особенности).
Однако мой оракловый сенсей наглядно мне показал, что использовать явные нуллы намного лучше и эффективнее. А если влом писать правильные запросы - не фиг идти в программисты СУБД.


 
ANB ©   (2006-10-02 11:04) [162]


> Создаем Foreign Key по нескольким колонкам

ИМХО : Ну нафиг такую практику.


 
pasha_golub ©   (2006-10-02 11:05) [163]


> Однако мой оракловый сенсей наглядно мне показал, что использовать
> явные нуллы намного лучше и эффективнее. А если влом писать
> правильные запросы - не фиг идти в программисты СУБД.

Поделись. Интересно узнать.


 
pasha_golub ©   (2006-10-02 11:05) [164]


> ANB ©   (02.10.06 11:04) [162]
>
>
>
> ИМХО : Ну нафиг такую практику.
>


Нафиг не нафиг, а факт есть.


 
ANB ©   (2006-10-02 11:11) [165]


> Поделись. Интересно узнать.

Ну, в частности, особенности наллов при работе в ссылках и уникальных ключах. Я уж подробно не помню, т.к. по привычке с первой работы (на которой он меня и учил) в создаваемых базах применял методу с убийством нуллов. И вот, когда мы опять пересеклись, он объяснил мне, что на первой работе эта порочная практика исторически сложилась. И разжевал, чем она плоха. Т.к. он - гуру в оракле, я принял дальше все как аксиому :)


 
Игорь Шевченко ©   (2006-10-02 11:16) [166]

pasha_golub ©   (02.10.06 11:01) [160]
ANB ©   (02.10.06 11:03) [161]

Я имел в виду не аспекты реализации, а суть задач. Так вот, по сути задач мне не приходилось сталкиваться с проблемами, которые требовали бы явного отличия NULL от пустой строки.


 
ANB ©   (2006-10-02 11:18) [167]


> Так вот, по сути задач мне не приходилось сталкиваться с
> проблемами, которые требовали бы явного отличия NULL от
> пустой строки.

+1.

наверное, поэтому оракл пустую строку сам в нулл и перекидывает.


 
kaif ©   (2006-10-02 11:25) [168]

2 Игорь Шевченко ©   (02.10.06 10:50) [157]

А позволяет ли ORACLE создать уникальный ключ на строковое поле, если оно не определено как NOT NULL?
Если нет, то как мне создать набор уникальных значений (пусть это будут "отчества"), включающих "пустой" элемент?
Или ORACLE позволяет создавать уникальные ключи на поля, допускающие NULL? Или только для строк это так? Или я должен вставлять "-" для варианта "Отчество отсутствует" ? И как тогда у меня дела будут с конкатенацией? Типа "Элвис Пресли -" ? Или типа
CASE WHEN THEN ELSE END, чтобы избежать этой проблемы?

Что здесь удобного?
Я пока не вижу ни одного дополнительного удобства, которое не создало бы новых неудобств.

Вот в IB я не вижу такого неудобства. Я могу создать справочник отчеств, содержащий пустой элемент ID,NAME (0, ""). При этом поле NAME четко NOT NULL. И имеется ключ CONSTRAINT UNIQUE(NAME). И никакого гимора. И никаких "-" при конкатенации. Какое удобство я получу, если IB вдруг взумает отождествлять NULL и пустую строку? Никакого - одну головную боль.


 
evvcom ©   (2006-10-02 11:30) [169]

> [159] ANB ©   (02.10.06 10:59)
> А NVL в FB нету.

Ну а COALESCE-то вроде есть?

> [164] pasha_golub ©   (02.10.06 11:05)
> Нафиг не нафиг, а факт есть.

Искоренять такие факты надо... гы, ударом по карману. :)

> особенности наллов при работе в ссылках и уникальных ключах

ссылки и уникальные ключи строятся на индексах, а нульные значения в индекс не попадают, потому, если ссылка ни на что не указывает, то это и не проверяется. А также null-значение не мешает добавлению уникальной записи, т.к. нет еще такой записи в индексе. С chr(1) в этом случае будут большие проблемы, созданные искусственно.


 
Игорь Шевченко ©   (2006-10-02 11:34) [170]

kaif ©   (02.10.06 11:25) [168]

Я, дорогой Ашот, работал не только с Oracle. Я (еще раз) говорю о задачах, независимо от используемой СУБД, в которых не требовалось отличать NULL от пустой строки. Представь, что есть СУБД, в которой столбец со значением NULL может входить в Primary key.


 
evvcom ©   (2006-10-02 11:37) [171]

> [168] kaif ©   (02.10.06 11:25)
> А позволяет ли ORACLE создать уникальный ключ на строковое
> поле, если оно не определено как NOT NULL?

Т.е. допускающее NULL-значения.

> Или ORACLE позволяет создавать уникальные ключи на поля,
> допускающие NULL?

По-моему, это одно и то же. Да, допускает, легко.

> Или только для строк это так?

Для любых типов.

> Я могу создать справочник отчеств, содержащий пустой элемент
> ID,NAME (0, ""). При этом поле NAME четко NOT NULL.

Аналогично, только не будет строки (0,"") в этом справочнике. Пока экономия 1 строка.

> И имеется ключ CONSTRAINT UNIQUE(NAME). И никакого гимора.
> И никаких "-" при конкатенации.

Аналогично ключ, никакого гимора и никаких "-".


 
Reindeer Moss Eater ©   (2006-10-02 11:39) [172]

А как в Вашем случае передаётся пустая строка?
В моем случае никак, так как передавать нечего.
Мне известно два варианта:
1. Передать в строке некий символ, информирующий, что это пустая строка. Чаще всего в качестве такого символа используется символ 0x00. Хотя, в принципе, ничто не мешает вместо него использовать какой-либо другой символ или даже их комбинацию. Но, согласитесь, пустая строка, содержащая символ (хотя бы один) уже не является пустой строкой.
2. Передать дополнительную информацию, сообщающую, что в строке нет символов. Чаще всего в качестве такой информации используется длина передаваемой строки, хотя можно использовать, например, некий флаг, сообщающий, что строка пустая. В данном варианте физическая реализация передаёт вообще не строку, а информацию о ней.


Оба случая передают не пустую строку, а левую информацию о том, что кто-то хотел передать пустую строку.
Переданная инфа не обладает свойствами пустой строки.
Длина её не равна 0, сумма длин не равна нулю. Конкатенация с другими строками не будет равна самим строкам и т.д.

Вывод - это не способ, а фигня.

В любом случае между передающей и принимающей сторонами должно быть соглашение, как правильно интерпретировать поток данных, чтобы корректно определить пустые строки. В противном случае клиентская сторона так и не узнает, что ей передавали пустые строки.

Соглашение для строковых типов уже уже есть - это поток байтов (юникод для простоты не рассматриваем)

Так почему если для передачи пустых строк используется дополнительная информация, то таким же способом нельзя передать NULL?
так почему же для передачи пустой строки (такого же обычного и равноправного значения как и любое другое значение строки) вдруг не с того ни с сего потребовалось доп информация?

Не потому ли что пустая строка - это особое значение строкового типа, эквивалентное нулу?


 
evvcom ©   (2006-10-02 11:42) [173]

> [171] evvcom ©   (02.10.06 11:37)

Гы, "отправить" нажал... :)
Только в подчиненной таблице поле со ссылкой на справочник тоже будет допускать null-значения. Экономия:
1. в виде одного значения number на каждую null-строку
2. в виде отсутствия проверки на наличие "нулевой" строки в справочнике.
Ну и в sql вместо допустимого inner join надо будет использовать outer join


 
pasha_golub ©   (2006-10-02 11:42) [174]


> evvcom ©   (02.10.06 11:30) [169]


> Искоренять такие факты надо... гы, ударом по карману. :)

Если звезды зажигаются, то значит это кому-нибудь нужно (с) не мое


 
Reindeer Moss Eater ©   (2006-10-02 11:44) [175]

> Я могу создать справочник отчеств, содержащий пустой элемент
> ID,NAME (0, ""). При этом поле NAME четко NOT NULL.


Зачем в справочнике пустое отчество?
В таблице персонала создается внешний ключ на справочник.
Сам справочник имеет уникальный констрейнт на поле отчества.
Пустое значение отчества в справочнике нафиг не нужно (при создании записи в таблице открывать запрос к справочнику только для того, чтобы комбобоксом вставить в поле нулл или пустую строку?)

А вот поле внешнего ключа может содержать либо валидный ключ либо нулл.

Все логично и просто.


 
kaif ©   (2006-10-02 11:49) [176]

2 Игорь Шевченко ©   (02.10.06 11:34) [170]
Я прекрасно понимаю, Игорь, что ты говоришь.
Но я всего лишь наставаю на том, что NULL теоретически не есть "одно из возможных значений", а есть значение, свидетельствующее о том, что "значение неизвестно". Или же нам придется пользоваться математикой вида (NULL=NULL) ==TRUE и (NULL<>NULL) ==FALSE. То есть отождествить NULL и пустое значение.

Скажу тебе по секрету, я тоже ни разу не сталкивался с задачами, где нельзя было бы все NULL  в числовых полях перестать отличать от нуля. Но почему-то я не стал сторонником отказа от понятия NULL. Наоборот, я стал сторонником максимальных NOT NULL ужесточений на числовые поля.

Идея NULL заставляет нас задумываться в процессе нормализации.
Отказ от NULL нас расслабляет в этом смысле.
Если поддерживать все то, что расслабляет, то отождествление NULL с пустыми строками - и есть генеральный путь.

Предлагаю отождествлять NULL и 0 в числовых полях тоже. Если кому надо - пусть флаги лепит.
Оставим NULL только для дат.
Хотя нет.
Для дат удобнее придумать что-то вообще иное.
Давайте для удобства в ANSI SQL введем две даты: "очень давно" (ONCE_UPON_A_TIME) и "когда-нибудь в будущем" (END_OF_THE_WORLD). Знаете, насколько удобнее станет программировать!


 
evvcom ©   (2006-10-02 11:49) [177]

> [174] pasha_golub ©   (02.10.06 11:42)

Это не звезды, это туманности. :)


 
Игорь Шевченко ©   (2006-10-02 11:53) [178]

kaif ©   (02.10.06 11:49) [176]


> Идея NULL заставляет нас задумываться в процессе нормализации.
>
> Отказ от NULL нас расслабляет в этом смысле.
> Если поддерживать все то, что расслабляет, то отождествление
> NULL с пустыми строками - и есть генеральный путь.
>
> Предлагаю отождествлять NULL и 0 в числовых полях тоже.
> Если кому надо - пусть флаги лепит.


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


 
kaif ©   (2006-10-02 11:57) [179]

Неужели гуру SQL или их ученики не видят разницы между "Отчество не неизвестно" и "Отчества не существует"?


 
Reindeer Moss Eater ©   (2006-10-02 12:03) [180]

Неужели гуру SQL или их ученики не видят разницы между "Отчество не неизвестно" и "Отчества не существует"?

Эта разница существует в предметной области. А с точки зрения хранения данных никакой разницы нет.
Точнее эта разница есть только в одном случае:

раз в неделю админ выполняет запрос к контрагентам и получает список всех, у кого отчество is null (а не пустая строка). Дальше снаряжается экспедиция по адресам этих контрагентов с целью добыть отчество в личной беседе. Если нулл и пустая строка не различаются, и есть контрагенты без отчеств, система может зациклиться.

В остальных случаях разницы никакой нет.

:)


 
evvcom ©   (2006-10-02 12:06) [181]

> [176] kaif ©   (02.10.06 11:49)

Ну, Ашот, не надо перегибать. Все-таки 0 - это вполне реальное значение. Даже визуально 0 и "нет значения, пусто" хорошо различаются. Пустая же строка и null визуально неразличимы. И какая мне разница, что реально запишется в базу null или пустая строка?
Да, Оракл отошел в реализации от стандартов, но сделал это ради увеличения быстродействия. С другой стороны, уже кто-то выше писал, что стандарты тоже люди писали.


 
kaif ©   (2006-10-02 12:06) [182]

2 Игорь Шевченко ©   (02.10.06 11:53) [178]
OK
Возьмем описание крови доноров.

Группа, Резус, фактор Kell.

Группа принимает одно из 4 значений: 1,2,3,4
Резус принимает одно из двух значений (+,-) и его удобно записать в виде Char(1).
Фатор Kell может отсутствовать (пустая строка) или иметь некотлоые значения (например, + или KK)

Разница между тем, что Kell фактор отсутствует или не определен - вполне осязаемая. Реципиент умрет.
В ORACLE понадобится флаг. Ну куда без флага деться?
И если нужно сделать запрос по всем донорам, для которых не определяли Kell, то SQL-щик, незнакомый с особенностями ORACLE, сделает (думая ошибочно, что он не в сумасшедшем доме) запрос вида:

 SELECT * FROM DONOR WHERE KELL IS NULL.

И получит фигню.

Если он не занимался у сенсея ORACLE, конечно.
:)


 
kaif ©   (2006-10-02 12:08) [183]

2 Reindeer Moss Eater ©  
Отчество Джнона Леннона - в студию.


 
Игорь Шевченко ©   (2006-10-02 12:12) [184]

kaif ©   (02.10.06 12:06) [182]


> Группа принимает одно из 4 значений: 1,2,3,4
> Резус принимает одно из двух значений (+,-) и его удобно
> записать в виде Char(1).
> Фатор Kell может отсутствовать (пустая строка) или иметь
> некотлоые значения (например, + или KK)
>


Ну и неправильно, что пустая строка. Надо писать большими буквами "ОТСУТСТВУЕТ". В противном случае ты при выборке без критерия по этому полю получишь визуально неразличимую разницу между "не определен" и "отсутствует" во многих СУБД.


 
Kerk ©   (2006-10-02 12:14) [185]

> [184] Игорь Шевченко ©   (02.10.06 12:12)

Причем на уровне представления данных. nvl() для того и придумали :)


 
Reindeer Moss Eater ©   (2006-10-02 12:17) [186]

Отчество Джнона Леннона - в студию.

John Winston Lennon

Хотя конечно это не отчество :)
Разница-то какая?
Конкатенация имен Леннона в ведомости на зарплату в Apple нарисует правильный результат.
:)


 
kaif ©   (2006-10-02 12:26) [187]

Игорь Шевченко ©   (02.10.06 12:12) [184]

Ну и неправильно, что пустая строка. Надо писать большими буквами "ОТСУТСТВУЕТ". В противном случае ты при выборке без критерия по этому полю получишь визуально неразличимую разницу между "не определен" и "отсутствует" во многих СУБД.


Вот для этого мужики и собрались и придумали стандарт SQL в 92 г.
Я подозреваю, что первоначально предполагалось, что этот язык освоят юзеры. Как минимум менеджеры звена выше низшего.
Но юзеры не захотели осваивать.
SQL стал языком программистов.
В этом и есть вся фигня. Так как все это вместо красивого и строгого соглашения стало зависеть от реализации, удобства, вкуса и т.п. То есть потеряло всякий смысл.
Программисту все равно - вставить флаг, выводить "ОТСУТСВУЕТ!!!!!!" или окрашивать весь экран в красный цвет. Ему все равно, как это хранить - лишь бы быстро работало и было ясно как.
Если программисты сами не хотят вырабатывать международных стандартов, то у нас одна перспектива - XML.
То есть делание вида о том, что существует стандарт.
А по сути - стандарта просто не будет никакого.
Каждый сам себе стандарт -
www.vasyaupkin.com/my_sql_standard/namespaces/fuckall/2006/01/01


 
Игорь Шевченко ©   (2006-10-02 12:28) [188]

kaif ©   (02.10.06 12:26) [187]


> Вот для этого мужики и собрались и придумали стандарт SQL
> в 92 г.
> Я подозреваю, что первоначально предполагалось, что этот
> язык освоят юзеры. Как минимум менеджеры звена выше низшего.
>


Не совсем понял, причем здесь стандарт, для того, чтобы отличать в видимом представлении отсутствие строки и пустую строку.
Кстати, 0 для числовых полей визуально отличим от пустой строки. Может, поэтому 0 и не отождествляют с NULL ?


 
Kerk ©   (2006-10-02 12:29) [189]

> [187] kaif ©   (02.10.06 12:26)

CREATE OR REPLACE VIEW view_kell AS
SELECT last_name, NVL(kell_value, "ОТСУТСТВУЕТ")
  kell_value FROM kell;


 
Игорь Шевченко ©   (2006-10-02 12:30) [190]

Kerk ©   (02.10.06 12:29) [189]


> Разница между тем, что Kell фактор отсутствует или не определен
> - вполне осязаемая. Реципиент умрет.


Читать, в связи с


> Фатор Kell может отсутствовать (пустая строка)


 
Reindeer Moss Eater ©   (2006-10-02 12:36) [191]

В одном случае (пусто - эквивалент нул) программер вынужден либо заводить флаг в таблице, либо использовать значение "отсутствует" что бы пациент не умер.

В другом случае (пусто - самостоятельное значение) программер вынужден использовать флаги или эскейп последовательности что бы записать это значение на медианоситель. Тоже для того, что бы пациент не помер.


 
kaif ©   (2006-10-02 12:37) [192]

Игорь Шевченко ©   (02.10.06 12:28) [188]
Кстати, 0 для числовых полей визуально отличим от пустой строки. Может, поэтому 0 и не отождествляют с NULL ?


Я часто прибегаю к таком приему:
MyField.DisplayFormat := "#,##0.00, -#.##0.00, "
Особенно если таблица широкая и в ней много нулей.
Так читабельнее.
Особенно если это отчет о продажах.
Здесь NULL тоже не будет отличаться от 0.
И что, теперь это довод?


 
Игорь Шевченко ©   (2006-10-02 12:42) [193]

kaif ©   (02.10.06 12:37) [192]

Что с пациентом делать будем для запроса по группе крови и резусу без учета фактора ?


> MyField.DisplayFormat := "#,##0.00, -#.##0.00, "
> Особенно если таблица широкая и в ней много нулей.
> Так читабельнее.


Ты волен делать все, что тебе угодно, но как в этом случае ты будешь отличать значения NULL и 0 в представлении ?


 
Reindeer Moss Eater ©   (2006-10-02 12:46) [194]

Если утверждается, что совершенно необходимо различать значения "пустая строка" (нет отчества вообще как у Леннона) и нулл (есть, но мы его не знаем), то я например могу заявить, что совершенно необходимо отличать числовое значение 5000 (оклад введен в поле главбухом) от значения 5000 (оклад введен в поле сантехником Потаповым).

Та же самая история. Значение одно и тоже, но мы зачем-то заморачиваемся программно на то, что не знаем как его интерпретировать.
То ли в самом деле нет отчества, то ли оклад может и не 5000 на самом деле.


 
pasha_golub ©   (2006-10-02 12:47) [195]

Ладно, наплевали на стандарт. Но плюйте повсеместно. Почему для числовых NULL обрабатывается полностью, а для строковых как Бог на душу положит?


 
evvcom ©   (2006-10-02 12:49) [196]

Вот, блин, ополчились!
Не нравится Оракл, не юзайте. На нас спрос будет выше. :)


 
Reindeer Moss Eater ©   (2006-10-02 12:50) [197]

Кто сказал, что стандарт попран?
Стандарт обязывает обеспечить особое волшебное значение null для всех типов данных. Вот для строк этим null значением и будет пустая строка.


 
kaif ©   (2006-10-02 12:50) [198]

2 Reindeer Moss Eater ©   (02.10.06 12:36) [191]
Согласен.
Поэтому я и рассматриваю эту проблему не под призмой реализации, а под призмой стандарта.

Так как обмен данными предполагает, что сапиенсы вырабатывают стандарты взаимопонимания.

И вероятность того, что кто-то "на том конце" не в курсе, что флаг KELL_IS_NOT_DEFINED означает то же самое, что в другой базе KELLA_NET выше, чем если оба программиста знают, что KELL IS NULL означает иное, чем KELL = "" и может для проверки своего предположения сразу сделать запрос вида:

SELECT COUNT(*), KELL FROM T1
GROUP BY KELL

и убедиться, что здесь есть именно та информация, на которую он рассчитывает.

Если мы переведем спор в плоскость реализации, то станет действительно все равно. Это будет дело вкуса.

Я придерживаюсь принципов нормализации.
А создание поля "Флага" нарушает эту самую нормализацию, так как образуется атрибут, неявно зависящий от другого атрибута и не зависящий от первичного ключа. Что значит неявно зависящий?
Означает, что ситуацию (KELL = "KK") and (KELL_NET = FALSE) невозможно интерпретировать иначе, как испорченные данные. А KELL IS NULL однозначно говорит о том, что имелось в виду. Существует логическая опасность различной интерпретации данных, если мы вносим вместо одного поля два поля для хранения какого-то одного атрибута сущности.
Тогда мы должны накладывать дополнительные констрейнты еще на стадии создания данных и поддерживать их на всем пути миграции таких данных.
ИМХО, это путь от нормализации - черт знает куда.
Мы получаем избыточность, если заводим флаг.
Мы должны уже запрещать некоторые сочетания.
А избыточность для меня - верный признак нарушения уже первой нормальной формы.

ИМХО, конечно.


 
Reindeer Moss Eater ©   (2006-10-02 12:53) [199]

Ну а как [194] и оклад в 5000 ?


 
pasha_golub ©   (2006-10-02 12:54) [200]

NULL = ВНИМАНИЕ! ДАННЫЕ НЕ ПОЛНЫЕ! НЕ РАБОТАЙТЕ!
"" = ПОХРЕНУ! РАБОТАЙТЕ КАК ХОТИТЕ!

Есть разница?


 
pasha_golub ©   (2006-10-02 12:55) [201]


> evvcom ©   (02.10.06 12:49) [196]
>
> Вот, блин, ополчились!
> Не нравится Оракл, не юзайте. На нас спрос будет выше. :
> )
>

Не-е-е, не надо. ;-) Я против Оракла ничего против не имею. Абсолютно. Тут вопрос шире, и абсолютно не привязан к Ораклу или другой СУБД.


 
Игорь Шевченко ©   (2006-10-02 12:56) [202]

pasha_golub ©   (02.10.06 12:54) [200]


> NULL = ВНИМАНИЕ! ДАННЫЕ НЕ ПОЛНЫЕ! НЕ РАБОТАЙТЕ!
> "" = ПОХРЕНУ! РАБОТАЙТЕ КАК ХОТИТЕ!
>
> Есть разница?


Нету


 
evvcom ©   (2006-10-02 12:57) [203]

> [198] kaif ©   (02.10.06 12:50)

Для KELL кроме "KK", "+" и null можно ввести "-" (аналог ИШ [184]), который будет интуитивно понятен, уместится в char(1) (если и "KK" обозначить как "K"), не потребует дополнительного флага, точно также легко уложится в констрейнт и не будет никакой избыточности.


 
kaif ©   (2006-10-02 12:58) [204]

2 Reindeer Moss Eater ©   (02.10.06 12:53) [199]
Все очень просто.
Нет такой сущности как "оклад сотрудника".
Есть сущность "оклад сотрудника, введенный оператором".
Это действительно новый атрибут сущности - ссылка на "источник информации".
(работник, оклад, источник информации)
Если это важно, разумеется.

И здесь опять есть разница между тем, "неизвестно кто внес оклад" или "неизвестно, кто-нибудь вообще внес оклад или нет".


 
kaif ©   (2006-10-02 13:05) [205]

2 evvcom ©   (02.10.06 12:57) [203]
Согласен.
Только вот я не понимаю, зачем настаивать на том, что отождествление NULL и пустой строки создает удобство?
Я пока никакого удобства не вижу. Точнее вижу удобство за счет каких-то новых неудобств. Но при этом отказ от принятого стандарта.
Во имя чего, хотелось бы знать?

Я писал базы и для ORACLE. Не так много, правда. У меня были большие накопители NOT NULL и с проблемой NULL разбираться просто не приходилось. Но если бы я столкнулся с этой проблемой, боюсь, я был бы не  восторге от таких подходов.

Меня часто раздражает, что IBX-ы (компоненты Intebase Exress) интерпретируют пустую строку как NULL перед посылкой значения из DBEdit на сервер. Мне это не мнравится. А Игорь, фактически, утверждает, что это должно было бы мне нравится.
А мой опыт говорит мне совершенно о другом.


 
kaif ©   (2006-10-02 13:06) [206]

извиняюсь за орфографические ошибки
:)


 
Reindeer Moss Eater ©   (2006-10-02 13:06) [207]

Но как же так?

Если есть проблема интерпретации двух эквивалентных строковых значений в оракле, то почему нет проблемы интерпретации двух эквивалентных числовых значений в том же оракле или других серверах?


 
Игорь Шевченко ©   (2006-10-02 13:08) [208]

kaif ©   (02.10.06 13:05) [205]


> А Игорь, фактически, утверждает, что это должно было бы
> мне нравится.


Так что с визуальным представлением будем делать для фактора ? Я уже третий раз задаю этот вопрос, но ответа все равно не вижу.


 
Reindeer Moss Eater ©   (2006-10-02 13:56) [209]

И все же пример с отчеством - это вопрос интерпретации имеющихся значений.
Есть необязательный атрибут "отчество" у сущности "человек".
И varchar2 в Оракле позволяет хранить значение этого атрибута.
Это значение можно получить, напечатать и использовать в выражениях со строками. Все о"кей.

Если же программист заморачивается вопросом: "а что же на самом деле означает пустое значение в поле "отчество" это значит что он на самом деле нуждается еще в одном атрибуте сущности "человек". Точнее не он, а та предметная область для которой он нарисовал свою программу.
Если системе совершенно необходимо знать, если у чела отчество в принципе, то необходимо ввести такой атрибут.
Да и с точки зрения пользовательского интерфейса получается такой прикол:
Оператор допустим узнал, что у клиента нет отчества. А для ввода самого отчетства в программе dbEdit.
Получается:
- во первых не видно, что там находится, нулл или пустая строка.
- во вторых как ввести нулл, если там уже что-то было. (Скажем отчество было, но чел поменял вероисповедание или уехал в Америку и взял себе firstname,secondname, а отчество убрал из документов)

Вывод: В интерфейсе все равно будет какой-то контрол который:
1. Отображает нулл в поле или не нулл.
2. Позволяет явно записать нулл в поле.

Это значит, что просто напросто нужен еще один атрибут.
(Если хотим знать что же означает хранимое значение )

Тот мой пример с окладом введенным разными людьми просто не очень нагляден. Я хотел показать, что можно же задваться вопросом что же всетаки означает текущее хранимое значение оклада в 5000 единиц у работника.

Аналогия - полнейшая.


 
kaif ©   (2006-10-02 14:01) [210]

Игорь Шевченко ©   (02.10.06 13:08) [208]
Так что с визуальным представлением будем делать для фактора ? Я уже третий раз задаю этот вопрос, но ответа все равно не вижу.


Какая разница?
Допустим, я буду в том месте приложения, где это важно, зарисовывать ячейку сетки красным цветом. И что это меняет?

Я говорю о том, как себя будет ощущать SQL-щик, соединившейся с базой и делающий простейший SELECT. Нормальный SQL-щик, увидев поле KELL,  в котором есть и пустые значения и NULL, поймет, что пустые означают, что фактора KELL нет, а NULL - неопределенные, то есть анализ не проводился или данные забыли внести. Если же он заметит еще какое-то поле типа KELL_FLAG,  в котором иногда 1, то ему еще придется делать запрос вида:

 SELECT COUNT(*), KELL, KELL_FLAG

чтобы понять, что означает это флаг.
И если он получит набор вида:

2000, "", 0
5,      "", 1
15,    "K",0
300,  "K",1

то он не будет знать, как этот флаг вообще следует интерпретировать. И если у него нет возможности влезть в исходный текст приложения, которое писал программист до него и найти там некий хитрый IF, определяющий функцию флага в этой ситуации, то он обречен просто гадать.


 
euru ©   (2006-10-02 14:02) [211]


> Reindeer Moss Eater ©   (02.10.06 13:06) [207]

Пустая строка и NULL - это неэквивалентные значения, даже если визуально они похожи.


> Игорь Шевченко ©   (02.10.06 13:08) [208]

В общем случае формат хранения данных <> формат визуального представления данных.


 
Reindeer Moss Eater ©   (2006-10-02 14:03) [212]

Пустая строка и NULL - это неэквивалентные значения, даже если визуально они похожи

Это просто магическое заклинание или что-то иное?

Кстати, как визуально выглядит null?


 
Внук ©   (2006-10-02 14:04) [213]

Нда... Одни говорят, что могут обойтись без различия NULL и "". И, по-моему, я этим никто не спорит. Я тоже могу, кстати.
Другие говорят, что теоретически NULL и "" должны различаться, иначе нарушается логика и возникает зависимость от реализации.


 
Reindeer Moss Eater ©   (2006-10-02 14:05) [214]

kaif ©  
С программером все понятно. Вилки в коде и так далее.
Как быть с пользователем, которму надо занести нулл в отчество?


 
kaif ©   (2006-10-02 14:07) [215]

Вывод: В интерфейсе все равно будет какой-то контрол который:
1. Отображает нулл в поле или не нулл.
2. Позволяет явно записать нулл в поле.

Это значит, что просто напросто нужен еще один атрибут.
(Если хотим знать что же означает хранимое значение )


Не значит.

А вот если сервер не отличает пустую строку от NULL, то тогда нужно второе поле. О чем я и твержу.
И тогда второе поле, в котором указано HAS_NAME3 = 1 сочетается с пустой строкой не ясно как интерпретировать. То ли как то, что у чела отчество имеется, но оно неизвестно оператору, то ли как ошибку ввода данных, то ли как испорченные данные, то ли как то, что чел - сирота.
И будут нужны уже специальные инструкции дополнительно к такой базе данных.
:)


 
Reindeer Moss Eater ©   (2006-10-02 14:08) [216]

Как быть с пользователем, которму надо занести нулл в отчество?


 
Игорь Шевченко ©   (2006-10-02 14:10) [217]

kaif ©   (02.10.06 14:01) [210]


> Какая разница?
> Допустим, я буду в том месте приложения, где это важно,
> зарисовывать ячейку сетки красным цветом. И что это меняет?
>


Не, ты не понял. Мы берем того же неискушенного пользователя, составившего SQL-запрос и набравшего его...в Excel"е каком-нибудь


 
Внук ©   (2006-10-02 14:10) [218]

>>Reindeer Moss Eater ©   (02.10.06 14:08) [216]
 А зачем ему туда заносить NULL. Что-то изначально неизвестное может стать известным, не наоборот. Хотя, у меня для этого в полях ввода есть специальные кнопочки рядом.


 
Reindeer Moss Eater ©   (2006-10-02 14:12) [219]

Внук ©

Программер использует в своих корыстных целях особенность сервера отличать нулл от пустой строки что бы знать у кого отчества нет вообще.
Замечтаткльно!

Теперь:
Какие интерфейсные средства он дает юзеру что бы тот управлял состоянием отчества?

Как пользователю имея dbedit ввести нулл или пустую строку?
Как ему самому увидеть, есть у чела отчество или нет?


 
Kerk ©   (2006-10-02 14:14) [220]

> [219] Reindeer Moss Eater ©   (02.10.06 14:12)

Вопрос решается встраиванием в Edit кнопочки "X" для удаления данных и подсветкой фона Edit другим цветом (желтым, например). Хотя некоторая неинтуитивность в этом есть


 
kaif ©   (2006-10-02 14:18) [221]

Reindeer Moss Eater ©   (02.10.06 14:05) [214]
kaif ©  
С программером все понятно. Вилки в коде и так далее.
Как быть с пользователем, которму надо занести нулл в отчество?


Все делаем, как Вы и говорите.
ВОт строгое решение:

Имя
Отчество + птичка "отчество отсутствует"
Фамилия

Если юзер установил птичку, в поле пишется NULL.
Если не установил - выдается ошибка "Введите отчество или установите птичку".

Что касается отображения, то тот же IBExpert при выводе на экран результата запроса в поле "Отчество" покажет слово null красного цвета. Это и будет означать, что отчества нет.
Пустая строка в данном случае вообще исключена.
---------------------------------
Пойдем другим путем.
Интерфейс тот же, в поле "Отчество" вместо null  - пустая строка.
Если я не видел интерфейса ввода, то я не различу ситуации "отчества нет" от "его забыли ввести", так как у меня нет в руках дополнительного соглашения о такой реализации.
Хотя такая реализация с точки зрения реализации ничем и не отличается и даже имеет преимущество для конкатенации строк, но она требует дополнительных знаний, кроме стандарта SQL.


 
Reindeer Moss Eater ©   (2006-10-02 14:18) [222]

Вопрос решается встраиванием в Edit кнопочки "X" для удаления данных и подсветкой фона Edit другим цветом (желтым, например). Хотя некоторая неинтуитивность в этом есть

Вот то-то и оно, что неявно и подспудно такое интерфейсное решение является подпоркой для случая, когда программер не ввел совершенно необходимый системе атрибут сущности.


 
Внук ©   (2006-10-02 14:18) [223]

>>Reindeer Moss Eater ©   (02.10.06 14:12) [219]
 Фантазируй.
 А к чему эти вопросы?


 
Reindeer Moss Eater ©   (2006-10-02 14:19) [224]

Имя
Отчество + птичка "отчество отсутствует"
Фамилия


Итого:
четыре поля одно из которых для птички.


 
kaif ©   (2006-10-02 14:25) [225]

Вся суть спора вот в чем.
Если рассматривать базу данных как просто ХРАНИЛИЩЕ, то да.
Какая разница, что такое NULL?
Но базу данных мы понимаем, как систему связанной информации, а не просто как ХРАНИЛИЩЕ ДАННЫХ.
А в системе важно различать информация есть, или отсутствует.
Допустим, мы это реализуем с помощью флагов.
Прекрасно.
Только я покажу, что и без всякой нормализации (в одной широченной таблице) тоже можно хранить данные. И приведу миллион человек, которые скажут, что "ВЕСЬ ОПЫТ ИХ ЖИЗНИ УТВЕРЖДАЕТ, ЧТО КРОМЕ EXCEL-А ВООБЩЕ НИЧЕГО НЕ НУЖНО".

Поклонники нормализаций будут голосовать за NULL.
Мне так кажется.

Так как флаг просто нарушает первую нормальную форму, записывая один атрибут в два поля, если нужно отличить "пусто" и "нет данных". И если это не "подпорка", то что тогда подпорка?


 
Reindeer Moss Eater ©   (2006-10-02 14:29) [226]

Согласен.
Только я вот хочу еще знать что же на самом деле означает цифра 5000 в поле саллари у сотрудника.
Что же на смом деле означает цифра 1000 в поле прайс напрртив названия книги.
Что на самом деле означает False в поле married у соседки по офису?

Почему неоднозначными могуть быть только строки?
Куда мне податься?

:)


 
Reindeer Moss Eater ©   (2006-10-02 14:33) [227]

Так как флаг просто нарушает первую нормальную форму, записывая один атрибут в два поля, если нужно отличить "пусто" и "нет данных". И если это не "подпорка", то что тогда подпорка?

Ничуть.
Отдельно поле нужно только когда система хочет знать ответ на вопрос есть/нет. Это отдельный атрибут. Нормальные формы в норме.

Если же я пишу лог прибытия сотрудников на работу, то мне нафиг такое знание вметсе с атрибутом не сдалось. Я просто пишу результат конкатенации строк в лог.


 
Игорь Шевченко ©   (2006-10-02 14:35) [228]

kaif ©   (02.10.06 14:25) [225]

Не пользуйся Oracle, если он не соответствует твоим религиозным убеждениям, только и всего. Пусть Ларри Элиссону будет хуже. А то приходят тут разные...пуристы :)


 
euru ©   (2006-10-02 14:38) [229]


> Reindeer Moss Eater ©   (02.10.06 14:03) [212]
> Это просто магическое заклинание или что-то иное?
Теория множеств, реляционная алгебра.


Кстати, как визуально выглядит null?
Ага, это из серии "покажите мне ноль яблок".
Пример (гипотетический) реального NULL"а : ежемесячно сотрудникам выдают в конвертах некую заработанную ими сумму. Выдача пустого конверта (пустая строка) означает, что сотрудник ничего в этом месяце не заработал. Невыдача конверта (NULL) означает лишь, что по каким-то причинам его не выдали (например, сумма слишком большой оказалась, а подходящего конверта под рукой не было). С точки же зрения Oracle сотрудник, в случае невыдачи конверта, должен рассматривать это как выдачу пустого конверта и никаких претензий к руководству не предъявлять.


 
kaif ©   (2006-10-02 14:39) [230]

Reindeer Moss Eater ©   (02.10.06 14:19) [224]
Имя
Отчество + птичка "отчество отсутствует"
Фамилия

Итого:
четыре поля одно из которых для птички.


А вот и нет.
Птичка в данном случае только в интерфейсе.
Обе реализации потребуют только три поля.

И я согласен, что в случае употребления нормальных NULL гимора будет больше, если нужно будет запросить всех, у кого ФИО с точностью до отчества совпадают.

Однако отождествление всех челов, у которых вообще нет отчества с челами, у которых одинаковое отчество даст катастрофически неверный отчет, если кто-то решит выяснить,
"а у какого процента людей отчества одинаковые" и забудет при этом то, что пустые строки и NULL в данной таблице просто отождествлены.


 
evvcom ©   (2006-10-02 14:39) [231]

> [205] kaif ©   (02.10.06 13:05)
> Я пока никакого удобства не вижу.

А я не вижу неудобства. Это не пустое заявление. Пока на любой "а как?" я привел "а так!" В чем же неудобство?

> Меня часто раздражает, что IBX-ы (компоненты Intebase Exress)
> интерпретируют пустую строку как NULL перед посылкой значения
> из DBEdit на сервер.

Видимо, Оракл не одинок в своем понимании "как это должно быть".

> Мне это не мнравится.

Чем конкретно? Мне было б по-барабану. Все удобство/неудобство именно с визуализации начинается, и ею же заканчивается. А все проверки типа is null или ="" создают гораздо меньше удобств/неудобств. Имхо.

> [207] Reindeer Moss Eater ©   (02.10.06 13:06)
> Если есть проблема интерпретации двух эквивалентных строковых
> значений в оракле

Это надуманная проблема. На самом деле ее нет.

> [210] kaif ©   (02.10.06 14:01)
> Я говорю о том, как себя будет ощущать SQL-щик, соединившейся
> с базой и делающий простейший SELECT. Нормальный SQL-щик,
> увидев поле KELL,  в котором есть и пустые значения и NULL,
> поймет, что пустые означают, что фактора KELL нет, а NULL
> - неопределенные, то есть анализ не проводился или данные
> забыли внести.

Ну хорошо. Поддерживает такое СУБД, делаешь так. А если нет (Оракл), то делаешь как в [203]. Ты ж ведь с этим согласился! Все интуитивно понятно:
2000,"-" // ОТСУТСТВУЕТ!!! (с) ИШ
5,null // значение не определено
300,"K"
45,"+"


> [215] kaif ©   (02.10.06 14:07)
> А вот если сервер не отличает пустую строку от NULL, то
> тогда нужно второе поле.

Приведи реальный, а не надуманный пример, когда это просто необходимо. С KELL, надеюсь, разобрались? Я предложил вполне логичное решение.

> [220] Kerk ©   (02.10.06 14:14)
> Хотя некоторая неинтуитивность в этом есть

Вот именно неинтуитивность! А зачем это? Для чего различать? Практический смысл?


 
kaif ©   (2006-10-02 14:42) [232]

2 Reindeer Moss Eater ©

Если у Джона Леннона и Жюля Верна нет отчеств, означает ли это то же самое, как то, что отчества у этих двух уважаемых господ совпадают?


 
Внук ©   (2006-10-02 14:42) [233]

>>Игорь Шевченко ©   (02.10.06 14:35) [228]
 Попрошу в обчественном месте не выражаться. Вообще, давно известно, что лучшая СУБД - это FileMaker.


 
Reindeer Moss Eater ©   (2006-10-02 14:47) [234]

Если у Джона Леннона и Жюля Верна нет отчеств, означает ли это то же самое, как то, что отчества у этих двух уважаемых господ совпадают?

Если в Оракле, то отчества этих двух человеков не совпадут.
Там с клиента вставят либо нулл либо пустую строку и поля не будут равны.


 
evvcom ©   (2006-10-02 14:49) [235]

> [221] kaif ©   (02.10.06 14:18)


> то я не различу ситуации "отчества нет" от "его забыли ввести"

Практический смысл сего?

> Хотя такая реализация с точки зрения реализации ничем и
> не отличается и даже имеет преимущество для конкатенации
> строк, но она требует дополнительных знаний, кроме стандарта
> SQL.

Чтобы писать эффективные приложения, программист обязан обладать дополнительными знаниями.

> [229] euru ©   (02.10.06 14:38)

Сумма денег в Оракле имеет тип number. :)

> [230] kaif ©   (02.10.06 14:39)
> если кто-то решит выяснить,
> "а у какого процента людей отчества одинаковые"

Неужели в реальной жизни кого-то интересуют такие отчеты?


 
euru ©   (2006-10-02 14:55) [236]


> Reindeer Moss Eater ©   (02.10.06 14:33) [227]
> Ничуть.Отдельно поле нужно только когда система хочет знать
> ответ на вопрос есть/нет. Это отдельный атрибут. Нормальные
> формы в норме.

Номер Флаг Значение
  1    0   ""
  2    0   "Петрович"
  3    1   ""
  4    1   "Петрович"


Номер 1. Избыточно поле "Значение": по флагу видно, что данных нет.
Номер 2. Неконсистентность данных.
Номер 4. Избыточно поле "Флаг": по значению видно, что данные есть.


 
kaif ©   (2006-10-02 14:55) [237]

Reindeer Moss Eater ©   (02.10.06 14:47) [234]
Если в Оракле, то отчества этих двух человеков не совпадут.
Там с клиента вставят либо нулл либо пустую строку и поля не будут равны.


То есть ORACLE не избавит нас от необходимости в запросе по всему FIO все равно оговаривать OR OTCHESTVO IS NULL ?
Тогда в чем "очевидность" такого решения?
Ведь для пользователя, который легко может делать конкатенации таких пустых строк будет очень странным, что при запросе с

WHERE T1.F = T2.F and T1.I = T2.I and T1.O = T2.O

почему-то (????) выпали все американцы.

Впрочем, он, возможно, и не заметит.
Так что неудобств действительно никаких у него не будет.

:))))))


 
Reindeer Moss Eater ©   (2006-10-02 14:58) [238]

Граждане, мы постоянно уходим от сути.
Надо всего навсего решить является ли пустая строка сама по себе (когда она еще не стала пустым отчеством Леннона) таким же самостоятельным полноценным значением как и любая другая строка. То есть правомерно ли было считать, что она является олицетворением значения null для строкового типа.

То есть неопределенного значения или отсутствующего значения. Значения, про которое нельзя ничего определенного сказать.

Что вы можете сказать про длину отчества Джона Уинстона Леннона?


 
kaif ©   (2006-10-02 15:00) [239]

Такой вопрос.
Я хочу, допустим, в ORACLE посчитать среднюю длину отчеств.
Ну, например, что-то вроде:

SELECT AVG(STRLEN(OTCHESTVO)) FROM T1

что я получу?

В IB я сразу получу NULL или ошибку вида "имеются значения NULL - нельзя вычислять среднее по такому набору".

А в ORACLE я получу ошибку?

Или я получу неверную среднюю длину отчеств за счет того, что американцы уменьшают эту среднюю длину?

Только не говорите мне, что такой запрос не имеет практического смысла.


 
kaif ©   (2006-10-02 15:03) [240]

2 Reindeer Moss Eater ©   (02.10.06 14:58) [238]

Я готов легко примириться с тем, что ORACLE считает пустую строку за NULL. Если он в выражении WHERE это понимает именно так.

Но меня смущает то, что он допускает при этом конкатенацию таких строк.
Это уже - совершенно вольное обращение с таким понятием.

А если я решу в выражении WHERE употребить конкатенацию, не приду ли я к очевидным противоречиям?


 
evvcom ©   (2006-10-02 15:04) [241]

> [237] kaif ©   (02.10.06 14:55)
> Ведь для пользователя, который легко может делать конкатенации
> таких пустых строк будет очень странным, что при запросе
> с
> WHERE T1.F = T2.F and T1.I = T2.I and T1.O = T2.O
> почему-то (????) выпали все американцы.

Ну так условие составлено без учета того, как Оракл разруливает данную ситуацию.
WHERE T1.F = T2.F and T1.I = T2.I and decode(T1.O, T2.O, 1, 0) = 1


 
Тугодум ©   (2006-10-02 15:04) [242]

Reindeer Moss Eater

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

Нет, не правомерно.

И всё же... Чем больше я думаю о подходе Oracle, тем больше он мне нравится. И по скорости работы, и по удобству конкатенации. Теперь я им в вину вменяю только один, впрочем очень страшный грех - они не смогли изменить стандарт. Надеюсь, какой-нибудь SQL-2008 будет включать эту фичу :)


 
Reindeer Moss Eater ©   (2006-10-02 15:05) [243]

Кстати, кайф, что Вы запишете в таблицу IB в поле отчество у Леннона?
Пустую строку или нулл?
По идее пустую строку.

А что она означает?
Только то, что у Леннона нет отчества.
Нет такой категории в его паспортных данных вообще.
Про его отчетсво нельзя ничего сказать определенного кроме того, что его нет.

Нельзя даже говорить про его нулевую длину, так как тогда получится что у
Жюля Верна и Леннона одинаковые по длине и содержанию отчества!

Вывод: пустая строка даже в ИБ - это (только логически) экавивалентна понятию (не значению типа данных, а понятию) NULL


 
Тугодум ©   (2006-10-02 15:07) [244]

WHERE T1.F = T2.F and T1.I = T2.I and decode(T1.O, T2.O, 1, 0) = 1

Или даже так:
WHERE T1.F||T1.I||T1.O||"X"=T2.F||T2.I||T2.O||"X"


 
kaif ©   (2006-10-02 15:08) [245]

SELECT T1.F||T1.I||T1.O, T2.F||T2.I||T2.O
FROM
 T1,T2
WHERE
 T1.F||T1.I||T1.O = T2.F||T2.I||T2.O

Что вернет?


 
Reindeer Moss Eater ©   (2006-10-02 15:11) [246]

Что вернет?
Это не важно!
:)

Ну все же!
Имеют ли одинаковые отчества Джон Леннон и Жюль Верн в мире смоделированном на IB?


 
evvcom ©   (2006-10-02 15:11) [247]

> [239] kaif ©   (02.10.06 15:00)

Только что проверил. Оракл убрал из рассмотрения null строки. Я задал 2 строки: 2 символа и null, получил в ответе 2. Это укладывается в твои ожидания?


 
euru ©   (2006-10-02 15:12) [248]


> evvcom ©   (02.10.06 14:49) [235]
> Сумма денег в Оракле имеет тип number. :)

1. Прошу подтвердить это ссылкой на документацию. А также прошу предоставить мне ссылку, запрещающую хранить сумму прописью в символьном поле.
2. Ну, если считать, что в руководстве (бухгалтерии) не ошибаются, а отсутствие конверта эквивалентно отсутствию денег в конверте, то, конечно, можно смело считать, что работал, но ничего не заработал.

Три раза :)


 
evvcom ©   (2006-10-02 15:14) [249]

> [244] Тугодум ©   (02.10.06 15:07)

Так нельзя.


 
Тугодум ©   (2006-10-02 15:16) [250]

evvcom ©   (02.10.06 15:14) [249]

А почему? Синтаксическая ошибка?


 
evvcom ©   (2006-10-02 15:18) [251]

> [248] euru ©   (02.10.06 15:12)

1. Тогда можно хранить "ничего не заработал!" :)
2. Да нафиг надо на конверт тратиться? :)


 
kaif ©   (2006-10-02 15:21) [252]

Reindeer Moss Eater ©   (02.10.06 15:05) [243]
Кстати, кайф, что Вы запишете в таблицу IB в поле отчество у Леннона?
Пустую строку или нулл?
По идее пустую строку.


Я запишу в IB null. То есть данных по отчеству - нет.
В ORCALE запишу null. То есть то же самое.

Но в ORACLE  я смогу делать конкатенацию, а IB мне придется применить какой-нибудь CASE для этой ситуации.

Однако допустим я обязательно хочу сделать поле "Отчество" в IB NOT NULL.
Тогда я запишу в него пустую строку для такой реализации.

У меня есть оба варианта реализации. Я свободен в выборе.

А в ORACLE что я буду делать?
Ставить пробел?
И уповать на то, что другие ораклисты меня простят, зная об этой проблеме?
Вы не чувствуете, что то, что Вам представлется хорошим решением, для меня представляется лишь новой проблемой?

Заметьте, я вовсе не гоню на ORACLE.
Мне нравится этот сервер.
Вот ели бы еще оставили на мое усмотрение, отождествлять пустые строки с NULL или нет - я бы не возражал. В IB этот выбор за мной имеется, а в ORACLE я его почему-то лишен.

А любой недостаток всегда можно выдать за преимущество.

Председатель колхоза заходит на собрание, бросает кепку и говорит:
- Ну все! Одной проблемой меньше!...
- Что, корма завезли?...
- Нет, стоять перестал...


 
Reindeer Moss Eater ©   (2006-10-02 15:22) [253]

Тугодум ©   (02.10.06 15:04) [242]
Reindeer Moss Eater

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

Нет, не правомерно.


Ага. Точно точно!
Учение Маркса всесильно, потому что у него такое же отчество как и у  Энгельса. (В мире IB)


 
evvcom ©   (2006-10-02 15:23) [254]

> [250] Тугодум ©   (02.10.06 15:16)

Потому что:
1. Наверняка ПО будем писать так, чтобы при сравнении не учитывать регистр, т.к. будем считать, что "Иванов Иван Иванович" = "ИВАНОВ ИВАН ИВАНОВИЧ".
2. Кроме отчества может быть неизвестным и имя.
3. Тогда по твоему условию точно окажется, что Upper("Иванов" || "А") = Upper("Иванова" || null)


 
Reindeer Moss Eater ©   (2006-10-02 15:24) [255]

Я запишу в IB null. То есть данных по отчеству - нет.
В ORCALE запишу null. То есть то же самое.


Это как же так?
Раньше мне говорили, что в IB пишут пустую строку когда отчества нет и не может быть, а null когда оно есть но не определно или неизвестно.


 
Тугодум ©   (2006-10-02 15:24) [256]

Reindeer Moss Eater ©   (02.10.06 15:22) [253]

Мы это уже обсуждали, давайте не будем повторяться. Ваша точка зрения понята мною в достаточной мере.


 
Reindeer Moss Eater ©   (2006-10-02 15:25) [257]

Тугодум ©

Я все надеюсь агрументы услышать. Почему это неправомерно.


 
Тугодум ©   (2006-10-02 15:27) [258]

Reindeer Moss Eater ©   (02.10.06 15:25) [257]

Потому что Length("")=0, а не NULL. Можете в Delphi проверить.


 
Reindeer Moss Eater ©   (2006-10-02 15:29) [259]

да мы тут все больше не про языки а про сущности.


 
Игорь Шевченко ©   (2006-10-02 15:29) [260]

Тугодум ©   (02.10.06 15:27) [258]

В Delphi появилось понятие NULL ?


 
Тугодум ©   (2006-10-02 15:30) [261]

evvcom ©   (02.10.06 15:23) [254]

А я буду в конец фамилии пробел добавлять. И в конец имени - тоже. И пускай мне Oracle попробует сказать, что это противоречит каким-либо стандартам...


 
Reindeer Moss Eater ©   (2006-10-02 15:30) [262]

Потому что Length("")=0, а не NULL. Можете в Delphi проверить.

Проверил. Получил парадокс одинаковых отчеств.


 
Тугодум ©   (2006-10-02 15:31) [263]

Reindeer Moss Eater ©   (02.10.06 15:30) [262]

Вы о чем? Прошу не забывать, с кем разговариваете :)


 
Тугодум ©   (2006-10-02 15:33) [264]

Игорь Шевченко ©   (02.10.06 15:29) [260]

Повторяю. В Delphi Length("")=0, а не NULL.


 
pasha_golub ©   (2006-10-02 15:33) [265]


> Reindeer Moss Eater ©   (02.10.06 15:25) [257]

Вернемся к числам.

Какое из целых чисел примем за олицетворение NULL? 0 или 1? Напоминаю, что умножив любое число на 1, получаем тоже число. Однако, прибавив к любому числу 0, получаем тоже число.


 
evvcom ©   (2006-10-02 15:35) [266]

> [261] Тугодум ©   (02.10.06 15:30)

Смайлик ты не поставил, потому решаю, что ты на полном серьезе. Дописал ты пробел к Ф, И, О. Потом решил подредактировать запись. Автоматом добавил еще по пробелу. И т.д. Искать на свою з... приключения - норма жизни?


 
evvcom ©   (2006-10-02 15:36) [267]

> [264] Тугодум ©   (02.10.06 15:33)

Не гони. А что же еще могло быть в Delphi?


 
euru ©   (2006-10-02 15:36) [268]


> evvcom ©   (02.10.06 15:18) [251]
> 1. Тогда можно хранить "ничего не заработал!" :)
Дык, а если человек заработал "Сто тыщ миллионов", а ему просто забыли конверт отдать? Как он должен реагировать?
Ну и, перефразируя Reindeer Moss Eater:
Кстати, а как пощупать сумму "ничего не заработал!"?


> 2. Да нафиг надо на конверт тратиться?:)
Вот и в руководстве так подумали: "А нафига нам на конверты тратиться?" И перестали выдавать конверты с зарплатой.
А сотрудники тоже сообразительные: "Конверты не дали, значит, мы ничего не заработали." И продолжили безвозмездно работать.

:)


 
ANB ©   (2006-10-02 15:37) [269]


>
> Повторяю. В Delphi Length("")=0, а не NULL.

Гы. самый прикол, что в оракле - тоже.


 
Игорь Шевченко ©   (2006-10-02 15:37) [270]

Тугодум ©   (02.10.06 15:33) [264]

И Length("")="RULEZZ" тоже в delphi не срабатывает. Отчего бы ?


 
pasha_golub ©   (2006-10-02 15:37) [271]

NULL можно также рассматривать как признак того, что значение не из множества разрешенных. Однако пустая строка входит в множество строк.


 
Тугодум ©   (2006-10-02 15:40) [272]

evvcom ©   (02.10.06 15:35) [266]

А у меня триггер пробелы добавляет. А получаю данные для редактирования и отображения из view, где конечные пробелы удаляются. То есть с пробельными значениями работает только сервер БД.


 
Тугодум ©   (2006-10-02 15:40) [273]

evvcom ©   (02.10.06 15:36) [267]

Попробуй на 0 разделить и узнаешь, кто из нас гонит.


 
Тугодум ©   (2006-10-02 15:42) [274]

ANB ©   (02.10.06 15:37) [269]

Я тут одну статью в пятницу приводил, в которой написано, что Length("")=NULL. Или это от версии Oracle зависит?


 
evvcom ©   (2006-10-02 15:43) [275]

> [268] euru ©   (02.10.06 15:36)
> Дык, а если человек заработал "Сто тыщ миллионов", а ему
> просто забыли конверт отдать?

Ну в любом случае человека сей факт возмутит, даже если ему принесут пустой конверт (а вдруг туда забыли денег положить?) Он пойдет в бухгалтерию.

> Кстати, а как пощупать сумму "ничего не заработал!"?

Сунь руку в пустой карман и пощупай :-)


 
Reindeer Moss Eater ©   (2006-10-02 15:43) [276]

Какое из целых чисел примем за олицетворение NULL? 0 или 1? Напоминаю, что умножив любое число на 1, получаем тоже число. Однако, прибавив к любому числу 0, получаем тоже число.

Никакое!
И это я говорил с самого начала.
Люое значение number в доступном диапазоне не являтся эквивалентом NULL. В силу того, что любое значение длиннее нуля байт.
Строковый тип в силу своей природы (произвольной длины которая может быть равна нулю) имеет такой аналог внутри своего диапазона.
И Оракл для нула не стал придумывать еще одно значение.


 
Reindeer Moss Eater ©   (2006-10-02 15:46) [277]

>Кстати, а как пощупать сумму "ничего не заработал!"?

Это подвопрос главного вопроса: насколько вырос мой баланс.


 
evvcom ©   (2006-10-02 15:47) [278]

> [269] ANB ©   (02.10.06 15:37)

Ни фига select length("") from dual дал null

> [272] Тугодум ©   (02.10.06 15:40)

А у меня такого гимора нет.

> [273] Тугодум ©   (02.10.06 15:40)

Ты это о чем? Где в [264], [267] деление на ноль?


 
kaif ©   (2006-10-02 15:47) [279]

Reindeer Moss Eater ©   (02.10.06 15:24) [255]
Я запишу в IB null. То есть данных по отчеству - нет.
В ORCALE запишу null. То есть то же самое.

Это как же так?
Раньше мне говорили, что в IB пишут пустую строку когда отчества нет и не может быть, а null когда оно есть но не определно или неизвестно.


Вы спросили "Как я поступлю" в отношении отчеств.
Я ответил.
Если я в этом случае поступлю как-то, из этого еще не следует, что так правильно поступать всегда.
А у Вас именно это следует.

Я допускаю такую задачу, где я поступлю в отношении тех же отчеств иначе. Например, если я делаю базу данных сотрудников - я поступлю, как написал. Но если бы я делал базу данных для посольства, я бы сделал в соотвествии со стандартом SQL. Пустыми строками я бы обозначил именно отсутствие отчества. А при помощи null - отсутствие данных.


 
Тугодум ©   (2006-10-02 15:47) [280]

Reindeer Moss Eater ©   (02.10.06 15:43) [276]

Я не вижу принципиальных различий между строками и числами.
Строка abcd состоит из 4 символов и помещается в Char(4), число 1234 тоже состоит из 4 символов и помещается в Dec(4). И у строки, и у числа есть длина. Давайте обозначать "" пустое число, то есть число из 0 десятичных разрядов. Будет ли такое число аналогом NULL? Если будет, то почему его не используют в СУБД? Отвечаю: нет, не будет, потому что
15 + NULL = NULL, а 15 + "" = 15.


 
Тугодум ©   (2006-10-02 15:50) [281]

evvcom ©   (02.10.06 15:47) [278]

У меня тоже гимора нет.

Ты это о чем? Где в [264], [267] деление на ноль?

Если бы Length("")=NULL, то Delphi бы генерил исключение.
То есть в Oracle своя особая математика.


 
pasha_golub ©   (2006-10-02 15:51) [282]


> Reindeer Moss Eater ©   (02.10.06 15:43) [276]


> В силу того, что любое значение длиннее нуля байт.

Твои же слова были про то, что мы не будем заморачиваться на физической реализации. Нету байт. Нету Оракла.

Есть множества. Строки и целые числа. Они равномощны. Так почему же для строк ты смог ввести олицетворение NULL"a, а для чисел не можешь?


> В силу того, что любое значение длиннее нуля байт.

Это всего лишь аспекты реализации. Я утверждаю, что пустая строка тоже длиннее нуля байт, а именно длиной в 1 байт. И в этом байте значение #0.


 
evvcom ©   (2006-10-02 15:52) [283]

> [280] Тугодум ©   (02.10.06 15:47)
> Давайте обозначать "" пустое число, то есть число из 0 десятичных
> разрядов.

Это что за число такое?

> 15 + NULL = NULL

Истина

> а 15 + "" = 15.

Что за арифметика такая? Кто учил мухи с котлетами складывать? Бред.


 
kaif ©   (2006-10-02 15:54) [284]

Я полагаю, что логика работы ORACLE имеет в данном случае мало общего с хитростями нормализации и гораздо больше общего с традициями такого языка, как JAVA. А в JAVA понятие null имеет определенную традицию в отношении обозначения пустой строки и конкатенации таких строк.
 ИМХО, отсюда ноги и растут у такой реализации.


 
Reindeer Moss Eater ©   (2006-10-02 15:54) [285]

кайф из этого следует, что отсутствующие в мире строковые сущности одинаково хорошо моделируются как пустой строкой, так и нулом.

В силу их экваивалентности.


 
Тугодум ©   (2006-10-02 15:54) [286]

evvcom ©   (02.10.06 15:52) [283]

Внимательнее. "" в выражении 15+"" НЕ строка, а число. Пустое число - полный аналог пустой строки. Кто не понимает, может обменяться со мной ником :)


 
evvcom ©   (2006-10-02 15:55) [287]

> [281] Тугодум ©   (02.10.06 15:50)
> Если бы Length("")=NULL, то Delphi бы генерил исключение.

Пошлю тебя на
> [260] Игорь Шевченко ©   (02.10.06 15:29)

:-)


 
Reindeer Moss Eater ©   (2006-10-02 15:56) [288]

Есть множества. Строки и целые числа. Они равномощны. Так почему же для строк ты смог ввести олицетворение NULL"a, а для чисел не можешь?

так ради бога.
Я уже третий или четверты  день прошу научить меня передавать и принимать эти пустые множества по медиа.

Так ведь ее учат!
Ну или подсовывают всякий бред.


 
evvcom ©   (2006-10-02 15:57) [289]

> [286] Тугодум ©   (02.10.06 15:54)

Сам придумал такое число? Пустое число в СУБД это NULL.

> Кто не понимает, может обменяться со мной ником :)

Не, оставайся при своем. :-)


 
kaif ©   (2006-10-02 15:58) [290]

В общем я понял.
Если я в Notepad сотру все символы в текствовм файле, то нужно заставить Билла Гейтса, чтобы он сразу этот файл и удалил с диска при попытке его сохранить.
Так как никакой разницы между Пустой.txt и file not found не существует в философской природе файлов. Ибо логическая длина 0.


 
Reindeer Moss Eater ©   (2006-10-02 15:58) [291]

Я утверждаю, что пустая строка тоже длиннее нуля байт, а именно длиной в 1 байт. И в этом байте значение #0.

А каково значение строки длиной один нулевой символ?
И равна ли она твоей пустой строке?


 
Тугодум ©   (2006-10-02 15:58) [292]

evvcom ©   (02.10.06 15:55) [287]

Я поэтому и писал про исключение при делении на 0.
В Delphi нет бесконечностей, поэтому при вычислении значения 1/0 вызывается исключение. Аналогично было бы при Length(""), если бы результат был неопределен (NULL). Однако Delphi совершенно спокойно возвращает правильный результат вычисления длины строки, а именно 0. Уф.


 
Reindeer Moss Eater ©   (2006-10-02 16:00) [293]

В общем я понял.
Если я в Notepad сотру все символы в текствовм файле, то нужно заставить Билла Гейтса, чтобы он сразу этот файл и удалил с диска при попытке его сохранить.
Так как никакой разницы между Пустой.txt и file not found не существует в философской природе файлов. Ибо логическая длина 0.


Билл не удаляет такие файлы потому что не может сосчитать сколько там пустых строк.
:)


 
Тугодум ©   (2006-10-02 16:00) [294]

evvcom ©   (02.10.06 15:57) [289]

Да причем здесь СУБД?! Нет никакой разницы между строками и целыми числами.


 
Игорь Шевченко ©   (2006-10-02 16:01) [295]

kaif ©   (02.10.06 15:54) [284]


> Я полагаю, что логика работы ORACLE имеет в данном случае
> мало общего с хитростями нормализации и гораздо больше общего
> с традициями такого языка, как JAVA. А в JAVA понятие null
> имеет определенную традицию в отношении обозначения пустой
> строки и конкатенации таких строк.
>  ИМХО, отсюда ноги и растут у такой реализации.


Сравни, сколько лет Oracle и сколько лет Java. Удивись.


 
Тугодум ©   (2006-10-02 16:01) [296]

Reindeer Moss Eater ©   (02.10.06 15:43) [276]

Вы [280] не заметили, игнорируете или не поняли?


 
pasha_golub ©   (2006-10-02 16:01) [297]


> Reindeer Moss Eater ©   (02.10.06 15:56) [288]
>
> Есть множества. Строки и целые числа. Они равномощны. Так
> почему же для строк ты смог ввести олицетворение NULL"a,
>  а для чисел не можешь?
>
> так ради бога.
> Я уже третий или четверты  день прошу научить меня передавать
> и принимать эти пустые множества по медиа.
>

Как ты думаешь, null terminated strings на кой ляд были придуманы?

Учу передавать пустые строки:

1. посылаешь данные о том, что будешь передавать строку. Конец строки символ #0
2. посылаешь сразу же #0

Трудно?


 
euru ©   (2006-10-02 16:02) [298]


> Reindeer Moss Eater ©   (02.10.06 15:56) [288]
> Я уже третий или четверты
>  день прошу научить меня передавать и принимать эти пустые
> множества по медиа.
А как по этому медиа ты собираешься передавать пустые строки?


 
Тугодум ©   (2006-10-02 16:03) [299]

15 + NULL = NULL, а 15 + "" = 15.

Даже мало того.

15 * "" = 15, 15 / "" = 15, "" / 15 = 15 и т.д.
В общем, полный джокер :)


 
kaif ©   (2006-10-02 16:03) [300]

Вопрос.
Существуют ли тектовые файлы нулевой длины?
:)
Правильно ли, чтобы некий поиск по файлам с пустым текстом выдавал "файл не найден" для всех таких файлов?


 
evvcom ©   (2006-10-02 16:05) [301]

> [290] kaif ©   (02.10.06 15:58)

Ну тогда и в таблице строку надо вытирать (удалять) начисто!

> [292] Тугодум ©   (02.10.06 15:58)
> В Delphi нет бесконечностей, поэтому при вычислении значения
> 1/0 вызывается исключение

Исключение вызывается не в Delphi.
В Delphi нет понятия null, потому и нет вопроса при вычислении длины пустой строки.


 
Reindeer Moss Eater ©   (2006-10-02 16:05) [302]

Вы [280] не заметили, игнорируете или не поняли?

Вот это?
>число 1234 тоже состоит из 4 символов

О таких вещах лучше не со мной. Это выше моего понимания.


 
kaif ©   (2006-10-02 16:05) [303]

Можно ли по электронной почте переслать пустой текстовый файл?
Я так понял, что это невозможно.
Так как у файла нет длины и пересылать, соответственно, нечего.
:)


 
k2 ©   (2006-10-02 16:06) [304]

Тугодум ©   (02.10.06 16:03) [299]
угу, а я могу установить среди себя стандарт, што арифметические операции с пустыми строками - ерунда и не дают ни null ни строки


 
Kerk ©   (2006-10-02 16:06) [305]

> [303] kaif ©   (02.10.06 16:05)

Можно


 
Тугодум ©   (2006-10-02 16:07) [306]

Reindeer Moss Eater ©   (02.10.06 16:05) [302]

Понятно, спасибо.


 
pasha_golub ©   (2006-10-02 16:08) [307]

Числа, кстати, если по-честному, нужно рассматривать не как определенный диапазон, который может поместиться в 2, 4 или любое другое фиксированное число байт. Множество целых чисел бесконечно. И если мы будет учитывать эту бесконечность, то увидим, что между строками и представлениями числа нет разницы.

Посему мой вопрос, где же аналог NULL на множестве, ну хотя бы, натуральных чисел?


 
evvcom ©   (2006-10-02 16:09) [308]

> [294] Тугодум ©   (02.10.06 16:00)
> Нет никакой разницы между строками и целыми числами

О!!! Это сильно сказано.

> [299] Тугодум ©   (02.10.06 16:03)

Тугодумова алгебра. :) Вставай в один ряд с Булем. :)


 
pasha_golub ©   (2006-10-02 16:11) [309]


> evvcom ©   (02.10.06 16:09) [308]
>
> > [294] Тугодум ©   (02.10.06 16:00)
> > Нет никакой разницы между строками и целыми числами
>
> О!!! Это сильно сказано.

А что вас пугает? 10-ое представление числа есть строка, в которой используются символы от 0 до 9. И еще знак "-". Йок?


 
k2 ©   (2006-10-02 16:12) [310]

pasha_golub ©   (02.10.06 16:11) [309]
любое число можно представить в виде строки но не наоборот, так што разница есть наверное? :)


 
k2 ©   (2006-10-02 16:13) [311]

хотя если рассуждать глобально то все што угодно можно представить в виде чего угодно
но к субд ораклу и нуллу это отношения уже давно не имеет


 
pasha_golub ©   (2006-10-02 16:13) [312]


> k2 ©   (02.10.06 16:12) [310]
>
> pasha_golub ©   (02.10.06 16:11) [309]
> любое число можно представить в виде строки но не наоборот,
>  так што разница есть наверное? :)
>

Да лана? Жалко.  А если я возму n-ричное представление числа, такое что я буду вынужден использовать все буквы алфавита, тогда можно?


 
pasha_golub ©   (2006-10-02 16:15) [313]


> k2 ©   (02.10.06 16:13) [311]
>
> но к субд ораклу и нуллу это отношения уже давно не имеет
>

Так оно вроде и не имело глобального отношения к Ораклу. Насколько мне видится, вопрос сводится к множествам и операциям над ними.


 
k2 ©   (2006-10-02 16:15) [314]

pasha_golub ©   (02.10.06 16:13) [312]
я и говорю, можно даже попробовать, взять любые два понятия и представить одно в виде другого или наоборот, потрепемся от души


 
evvcom ©   (2006-10-02 16:16) [315]

> [312] pasha_golub ©   (02.10.06 16:13)

В строке еще могут присутствовать непечатаемые символы. В каки-ричной системе они используются? :)


 
Reindeer Moss Eater ©   (2006-10-02 16:16) [316]

Так оно вроде и не имело глобального отношения к Ораклу. Насколько мне видится, вопрос сводится к множествам и операциям над ними.

Если бы у числовых типов были значения нулевой длины, то Оракл взял бы эти значения в качестве нулл значений.
Но таких значений нет и не только в Оракле.


 
k2 ©   (2006-10-02 16:16) [317]

pasha_golub ©   (02.10.06 16:15) [313]
про множества все давно сказали на первых страницах, как я понимаю сейчас спор о том, насколько неправ оракл в своих отождествлениях


 
Danilka ©   (2006-10-02 16:17) [318]

[303] kaif ©   (02.10.06 16:05)
Файл, кроме содержимого, имеет еще такой атрибут, как имя файла.
Послать файл с пустым именем по почте нельзя. Также, как и найти его на HDD.
При некотором допущении, имя файла можно рассматривать как PK записи в таблице.

:)


 
pasha_golub ©   (2006-10-02 16:20) [319]


> evvcom ©   (02.10.06 16:16) [315]
>
> > [312] pasha_golub ©   (02.10.06 16:13)
>
> В строке еще могут присутствовать непечатаемые символы.
> В каки-ричной системе они используются? :)
>

В моей, уважаемый. В моей! Вам привести формулы перехода от представления чисел в моей позиционной системе в десятичную? Возмите знакомую 16-ричную и раширьте на весь алфавит и непечатные символы.

Для обозначения цифр, можно использовать хоть китайские иероглифы. От этого число не перестает быть числом. И кажется мне, что это вы знаете. ;-)


 
Reindeer Moss Eater ©   (2006-10-02 16:23) [320]

Вот я разведчик, сижу на границе у реки и пишу донесение в центр.
Перед заброской мы договорились, что каждое вхождение строки "мама" в моем донесении - это рота самураев, решивших в эту ночь перейти границу у реки. Каждое "папа" - это танк с самураями.
А каждая пустая строка - это самурайская пушка.

Как быть-то?!
Ведь пустая строка - это по вашему полноценное значение.
А сколько пушек у самураев? Кто скажет?

/* Пожалуйста! Ради бога! Приколов с подсчетом CRLF не предлагать. */
Пустые строки в чистом виде как элемент сообщения!


 
Тугодум ©   (2006-10-02 16:24) [321]

evvcom ©   (02.10.06 16:09) [308]

Читай [307].

Не видать мне булевых лавров :)


 
evvcom ©   (2006-10-02 16:27) [322]

> [319] pasha_golub ©   (02.10.06 16:20)
> И кажется мне, что это вы знаете. ;-)

Правильно, кажется.
Но и мне кажется, что вы знаете, что все же разница между строкой и числом имеется. ;-)


 
Alx2 ©   (2006-10-02 16:31) [323]

>evvcom ©   (02.10.06 16:27) [322]

Запись числа в виде строки и представление строки (текста) числом можно сделать взаимнооднозначным. Рассматривать, например, все как последовательность байт. То есть как запись некоторого числа, в которой каждая цифра принимает 256 значений . И вся биекция.


 
Тугодум ©   (2006-10-02 16:31) [324]

Reindeer Moss Eater ©   (02.10.06 16:16) [316]

Попробую еще раз. Забудьте int, longint и прочее. Поговорим про матемаитку больших чисел, как тут часто спрашивают на форуме. То есть у нас есть DEC(N), где N-разрядность числа в десятичном предствалении. Такой тип есть во многих СУБД, например Informix. Каждая цифра записывается в BCD формате.
Теперь, что мы имеем? А имеем мы полный аналог CHAR(N). И получается, что  необходимо указывать признак завершения ЧИСЛА, или же хранить где-нибудь длину ЧИСЛА. Абсолютно так же, как и для строк. И вот при такой постановке у нас будет ПУСТОЕ ЧИСЛО, то есть число, длина которого равна нулю либо первый же байт (если речь о BCD) которого оказывается признаком окончания числа.


 
pasha_golub ©   (2006-10-02 16:31) [325]


>
> Reindeer Moss Eater ©   (02.10.06 16:23) [320]

Ясненько. Вы, значит, и отрицательные числа не приемлете? И трансцентдентные? Ведь вы их не сможете изобразить. А уж о комплексных вообще нужно молчать?


 
evvcom ©   (2006-10-02 16:32) [326]

> [321] Тугодум ©   (02.10.06 16:24)
> [307] pasha_golub ©   (02.10.06 16:08)
> увидим, что между строками и представлениями числа нет разницы

Представление числа - не есть само число. В
> [294] Тугодум ©   (02.10.06 16:00)
> Нет никакой разницы между строками и целыми числами.

говорится же о самих числах.
Флейм на 300 с лишним постов уже!


 
pasha_golub ©   (2006-10-02 16:34) [327]


> Но и мне кажется, что вы знаете, что все же разница между
> строкой и числом имеется. ;-)
>

Строка и представление числа. Именно такие термины я использовал.


 
Тугодум ©   (2006-10-02 16:34) [328]

Reindeer Moss Eater ©   (02.10.06 16:23) [320]

Как Вы строки разграничиваете? Или у Вас жестко задана длина в 4 символа (мама и папа). Откуда уверенность, что написано именно папа, а не папарацци?

Если разграничение идет по специальному символы, то Вы знаете способ передавать нулевую строку.
Если разграничение идет с помощью передачи длины слова перед передачей самого слова, то Вы опять-таки знаете способ передать нулевую строку.


 
pasha_golub ©   (2006-10-02 16:35) [329]


> evvcom ©   (02.10.06 16:32) [326]


>
> Представление числа - не есть само число. В

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


 
Тугодум ©   (2006-10-02 16:36) [330]

pasha_golub ©   (02.10.06 16:34) [327]

Когда оппоненты начинают уточнять термины, можно спокойно уходить победителем :)


 
pasha_golub ©   (2006-10-02 16:40) [331]


> Тугодум ©   (02.10.06 16:36) [330]
>
> pasha_golub ©   (02.10.06 16:34) [327]
>
> Когда оппоненты начинают уточнять термины, можно спокойно
> уходить победителем :)
>

Пусть проставляются. ;-)


 
Reindeer Moss Eater ©   (2006-10-02 16:40) [332]

Тугодум ©

Мое сообщение - поток байтов.
И каждое вхождение "мама", "папа" и так далее ....

Что здесь непонятного?
Нет никаких разделителей строк.
И нет никаких парамамарацци!

Я донесение своим в центр пишу что бы меня поняли, а не ребус что бы над ним поприкалывались.


 
Reindeer Moss Eater ©   (2006-10-02 16:43) [333]

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

ЗЫ Выделять "мама" я уже умею. И "папа" тоже.


 
Тугодум ©   (2006-10-02 16:45) [334]

Reindeer Moss Eater ©   (02.10.06 16:40) [332]

У Вас в качестве разделителя слов служит совпадение с каким-либо словом. Значит, надо было лучше договориться. А то я вот тоже решил передавать информацию, используя 3 слова: ма, мама и мамама. А в штабе почему-то жалуются, что понять ничего не могут. Может явный признак конца слова ввести вместо неявного?


 
Alx2 ©   (2006-10-02 16:47) [335]

>Reindeer Moss Eater ©   (02.10.06 16:43)

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

В любой строке есть пустая подстрока. Берешь что угодно, и говоришь, что нашел пустую подстроку. Местоположение ее тоже произвольное. Не ошибешься. Отсюда абсурдность идеи кодировать сообщения с помощью вхождения пустых строк.


 
Reindeer Moss Eater ©   (2006-10-02 16:49) [336]

тугодум, а в чем проблемы?
Я выбрал три полноценных значения, неравные между собой.
"мама" <> "папа" <> ""
Я не придумываю ребусы, я пишу сообщение для того, что бы его поняли.


 
Тугодум ©   (2006-10-02 16:50) [337]

Reindeer Moss Eater ©   (02.10.06 16:49) [336]

см [335]


 
pasha_golub ©   (2006-10-02 16:52) [338]


> Reindeer Moss Eater ©   (02.10.06 16:49) [336]

Я утверждаю, что путая строка должна отображаться как "<EMPTY STRING>". Теперь, я думаю в штабе будет полегче.


 
Gero ©   (2006-10-02 16:54) [339]

> [333] Reindeer Moss Eater ©   (02.10.06 16:43)


> Выделять "мама" я уже умею. И "папа" тоже.

Как, если не секрет?


 
Reindeer Moss Eater ©   (2006-10-02 16:59) [340]

Я утверждаю, что путая строка должна отображаться как "<EMPTY STRING>". Теперь, я думаю в штабе будет полегче.

Штабу будет легче.
Только информация о пушках была передана не пустыми строками, а строками "Empty_string"
И эти строки не обладают свойствами пустых строк.

Отсюда я сотый раз делаю вывод - пустая строка это абстракция, а вовсе не полноценное значение строкового типа.
Иначе траблов с донесением не было бы никаких как в случае с мамой и папой.

Вот и причина (в сотый раз уже по одном уместу) по которой Оракл выбрал пустую строку как спец значение нулл для строкового типа.


 
Reindeer Moss Eater ©   (2006-10-02 17:01) [341]

> Выделять "мама" я уже умею. И "папа" тоже.

Как, если не секрет?


За этим секретом (если он нужен всерьез) сходи в местный FAQ.


 
Тугодум ©   (2006-10-02 17:03) [342]

Reindeer Moss Eater ©   (02.10.06 16:59) [340]

Конечно, пустая строка особенная. Только вот непонятно, на каком основании ее свойства обязаны быть одинаковыми с NULL. Для чисел есть например плюс бесконечность, минус бесконечность, not a number, пустое число. Это всё NULLы по Вашей ораклиной логике? Или только NaN?


 
Gero ©   (2006-10-02 17:04) [343]

> [341] Reindeer Moss Eater ©   (02.10.06 17:01)

Нет, не нужен, благодарю.


 
Reindeer Moss Eater ©   (2006-10-02 17:07) [344]

Только вот непонятно, на каком основании ее свойства обязаны быть одинаковыми с NULL.

А кто этого требовал?
Пальцем покажи.
:)


 
Тугодум ©   (2006-10-02 17:08) [345]

Reindeer Moss Eater ©   (02.10.06 17:07) [344]

А кто этого требовал?
Пальцем покажи.


А это не Вы про олицетворение и правомерность кричали? :)


 
Reindeer Moss Eater ©   (2006-10-02 17:12) [346]

А это не Вы про олицетворение и правомерность кричали? :)
И что там в крике моем было про обязанность свойств быть одинаковыми?
Ссылку на пост и номер строки.

>Конечно, пустая строка особенная.
Вот поэтому Оракл и решил, что она адекватно отражает сущность нула.


 
Тугодум ©   (2006-10-02 17:27) [347]

Reindeer Moss Eater ©   (02.10.06 17:12) [346]

Понятно. Спасибо за дискуссию.


 
evvcom ©   (2006-10-03 08:59) [348]

> [323] Alx2 ©   (02.10.06 16:31)
> можно сделать

Мы говорим о том, что можно или о том, что есть?
Для процессора вообще нет никакой разницы, что выполнять, и как выполнять. Ему можно скормить хоть код, хоть данные, он это проглотит (может где-нить зависнет :)) Разница есть для нас, т.к. мы ожидаем какого-то правильного результата, и разница есть для компилятора, т.к. он написан таким образом, чтобы обезопасить нас от самих себя. Поэтому придумали различные типы данных, правила работы с ними и пр. Потому даже между Byte, Word и DWord есть разница, не говоря уж о каких-то числах и строках.

> [327] pasha_golub ©   (02.10.06 16:34)

Да, да, я об этом упомянул в [326], но защищать-то кинулся в [309] что?


 
Alx2 ©   (2006-10-03 16:39) [349]

>evvcom ©   (03.10.06 08:59) [348]

>Мы говорим о том, что можно или о том, что есть?

О том, что есть.

>не говоря уж о каких-то числах и строках.

Ты можешь абстракцию отличать от ее интерпретации? НЕТ разницы между строками и числами. Есть разные способы их интерпретировать.

PS
Криптоалгоритмами не пользовался? Найди в DES отличие между строкой и числом. Напротив, в алгоритме Лемпеля-Зива данные рассматриваются как строка.


 
Тугодум ©   (2006-10-06 13:16) [350]

А все-таки Oracle must die.

Он позволяет вставить пустую строку. Через CHR(0). И даже возвращает эту самую строку, если написать SELECT * FROM mytable WHERE myfield = CHR(0)

Теперь в EJB нужно анализировать с какой СУБД имеем дело, и заменять "" на CHR(0). Ну не бред ли?


 
Sergey13 ©   (2006-10-06 13:23) [351]

> [350] Тугодум ©   (06.10.06 13:16)

Наверное теперь начнутся массовые самоубийства ораклоидов, деинсталяции миллионов серверов и судебные иски к Ларри.
8-)


 
k2 ©   (2006-10-06 13:45) [352]

Тугодум ©   (06.10.06 13:16) [350]
если руки отрезать птице,
если ноги отрезать тоже,
эта птица умрет со скуки
потому што вставлять не сможет
:) навеяло
против массовиков-затейников хорошо административные меры помогают :)


 
Тугодум ©   (2006-10-06 14:25) [353]

k2 ©   (06.10.06 13:45) [352]

Вы о чем? Объясняю подробнее. Есть система. Есть БД, с которой она работает на уровне INSERT-UPDATE-DELETE-SELECT, то есть всё в рамках ANSISQL. Из-за перехода на Oracle теперь придется ее переписывать.
Это не массовики-затейники, это затейники-производители СУБД. Решили, понимаешь, 0.0001% времени и места сэкономить при работе с varchar и сhar.
"Поубивав бы" (c)


 
Sergey13 ©   (2006-10-06 14:32) [354]

> [353] Тугодум ©   (06.10.06 14:25)
> Есть система.
И она вставляет пустые строки через CHR(0)?


 
k2 ©   (2006-10-06 14:36) [355]

Тугодум ©   (06.10.06 14:25) [353]
я о том же, што и Сергей, только неудачно выразилась


 
Игорь Шевченко ©   (2006-10-06 14:36) [356]

Тугодум ©   (06.10.06 14:25) [353]


> Из-за перехода на Oracle теперь придется ее переписывать


Тебе радоваться надо - без работы не останешься.


 
Тугодум ©   (2006-10-06 15:05) [357]

Sergey13 ©   (06.10.06 14:32) [354]

Нет, она вставляла NULL и "", а потом извлекала их обратно. Теперь извлекать обратно не получается, точнее, извлекаются 2 NULL вместо NULL и ""


 
Игорь Шевченко ©   (2006-10-06 15:07) [358]

Тугодум ©   (06.10.06 15:05) [357]

А можно узнать, что за задача была, где требовалось NULL от пустой строки отличать и зачем ?


 
Тугодум ©   (2006-10-06 15:10) [359]

Игорь Шевченко ©   (06.10.06 15:07) [358]

Нет, нельзя.


 
pasha_golub ©   (2006-10-06 15:18) [360]


> Тугодум ©   (06.10.06 15:10) [359]
>
> Игорь Шевченко ©   (06.10.06 15:07) [358]
>
> Нет, нельзя.
>

А мне можно? ;-) Я свой. :0) Не Ораклоид. :)

Кстати, оффтопный вопрос. enterprisedb.com  - сайт EnterpriseDB, которая себя позиционирует как Оракло-совместимая. Кто-то из ораклоидов пробовал? Какие впечатления?

ЗЫ ;) Как там дела с NULL обстоят?


 
Sergey13 ©   (2006-10-06 15:18) [361]

> [357] Тугодум ©   (06.10.06 15:05)
> Нет, она вставляла NULL и "", а потом извлекала их обратно.

Сочувствую.


 
Игорь Шевченко ©   (2006-10-06 15:18) [362]

Тугодум ©   (06.10.06 15:10) [359]

Нельзя так нельзя. Впрочем, я тебе уже давал совет - не используй Oracle, нехай Ларри с голоду помрет, одним буржуином на свете меньше станет.


 
Danilka ©   (2006-10-06 15:25) [363]

[353] Тугодум ©   (06.10.06 14:25)
> Есть система. Есть БД, с которой она работает на уровне
> INSERT-UPDATE-DELETE-SELECT, то есть всё в рамках ANSISQL.

1. бизнеслогика не в субд? так эта система маздай, а вовсе не орокол.
2. нафига ваще нужен орокол, ежели используецца только "INSERT-UPDATE-DELETE-SELECT"??? в нем слишком много кайфных вещей, которых нет в анси, но которые делают из него именно то, что я люблю.
:)


 
Игорь Шевченко ©   (2006-10-06 15:43) [364]


> 1. бизнеслогика не в субд? так эта система маздай


Это ламеры мастдай.


 
Тугодум ©   (2006-10-06 15:47) [365]

Danilka ©   (06.10.06 15:25) [363]

1. Бизнес-логика в СУБД.
2. Решение о переходе на Oracle не я принимал :)
Я только слышал краем уха про кластеризацию, балансировку, быстродействие и прочее, прочее.


 
euru ©   (2006-10-06 15:55) [366]


> Danilka ©   (06.10.06 15:25) [363]
> 1. бизнеслогика не в субд? так эта система маздай, а вовсе не орокол.

Ну-ну...


 
Sergey13 ©   (2006-10-06 15:57) [367]

> [365] Тугодум ©   (06.10.06 15:47)
> Я только слышал краем уха про кластеризацию, балансировку,
> быстродействие и прочее, прочее.
Ну вот теперь есть повод убедиться. 8-)


 
Danilka ©   (2006-10-06 16:03) [368]

[364] Игорь Шевченко ©   (06.10.06 15:43)
> Это ламеры мастдай.

Обязательно!
:)

[366] euru ©   (06.10.06 15:55)
> Ну-ну...

А че? Развели флейм по поводу нуллов в Орокле на сотни постов, ненадоело ишшо? Давайте лучше холиварить на тему: "Где должна быть бизнеслогика?"
:)


 
k2 ©   (2006-10-06 16:05) [369]

Danilka ©   (06.10.06 16:03) [368]
пятница, хочется выходные провести не в муках :) давайте в понедельник с утра начнем :)


 
Danilka ©   (2006-10-06 16:16) [370]

[369] k2 ©   (06.10.06 16:05)
Да я тут набегами, по три поста в день. :)
Так, удочки закинул и убегаю, авось в понедельник будет что почитать и пописать. :)
Сейчас можно было-бы чирнуть на разжиг, но ладно, подожду понедельника.
Всем пока. :)



Страницы: 1 2 3 4 5 6 7 8 9 
10 вся ветка

Форум: "Прочее";
Текущий архив: 2006.10.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 1.6 MB
Время: 0.054 c
15-1160409437
Kerk
2006-10-09 19:57
2006.10.29
ВЛАДИМИР ПУТИН: СЕМЬ ЛЕТ У ВЛАСТИ


6-1144297719
RA81
2006-04-06 08:28
2006.10.29
Как сделать туннель между двумя серверами?


3-1156856047
bmp2006
2006-08-29 16:54
2006.10.29
Сложный запрос


2-1160928485
learner
2006-10-15 20:08
2006.10.29
Количество файлов в дректории.


3-1157362881
parovoZZ
2006-09-04 13:41
2006.10.29
Упростить запрос





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский