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

Вниз

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

 
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]


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


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



Страницы: 1 2 3 4 5 6 7 8 9 
10 вся ветка

Форум: "Прочее";
Текущий архив: 2006.10.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.62 MB
Время: 0.075 c
15-1159967209
ПЛОВ
2006-10-04 17:06
2006.10.29
HDD-шка шутит?


15-1160236750
Furyz
2006-10-07 19:59
2006.10.29
Core wars


5-1141656562
Belorus
2006-03-06 17:49
2006.10.29
Raize Components v4


2-1160637215
md
2006-10-12 11:13
2006.10.29
unit


15-1159951239
stone
2006-10-04 12:40
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский