Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как быть с ANSI NULLS ?
|
|||
|---|---|---|---|
|
#18+
Привет всем! В стандарте SQL92 присутствует данная фича, которая запрещает (или делает крайне неудобным) использование NULL в сравнениях переменных. Давайте возьмем пример на M$ SQL 2k... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Обычное дерево, не правда ли? Теперь напишем процедуру, которая возвращает первые элементы заданной ветки... Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... и попробуем поднять только корневые: Код: plaintext 1. Ну как успехи?... У меня, например, получается, что элементов без владельца не существует, а это неправда! Решение существует - надо искать так: Код: plaintext Что? Опять лажа? Ну конечно, у нас же все с нуля начинается... Код: plaintext Чувствуете, появились "волшебные" цифры? К чему я веду разговор? В том же M$ SQL по дефолту стоит SET ANSI_NULLS ON , и это требование стандарта. Но ведь это напрягает, и еще как! Попробуйте создать ту же процедуру, предварительно указав ей set ansi_nulls off - и все начнет работать без всяких isnull. И проблема "волшебных" чисел мгновенно пропадает. Мне не тяжело ставить set ansi_nulls off , но я не пойму главного - ЗАЧЕМ??? Тем более, если это доросло до стандарта... Что скажете, знатоки? P.S. Я не спрашиваю о том, как мне реализовать работу с деревом - я хочу узнать мнение окружаюхих, зачем именно зажгли именно эту звезду под названием "ANSI_NULLS"? P.P.S. Дома у меня инета нет, так что вернусь к обсуждению в понеденьник... Удачных выходных ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2004, 18:29 |
|
||
|
Как быть с ANSI NULLS ?
|
|||
|---|---|---|---|
|
#18+
по поводу "волшебных" цифр Вы правы - нехорошо, чтобы они появлялись... Поэтому я обычно пишу вот так: Код: plaintext Поэтому если вы ищете строки с вполне определенными значениями, то условие должно быть одно, а если ищете строки, значения которых неопределены, то условие должно быть другое. Вот что меня раздражает в MsSql, так это то, что в уникальный столбец нельзя вставить два неизвестных значения - тоесть если мне нужно вставить две записи, значения одного из уникальных полей которых неизвестны на момент вставки, я не могу этого сделать, даже если я точно знаю, что эти значения будут разными, когда они станут известными. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2004, 13:40 |
|
||
|
Как быть с ANSI NULLS ?
|
|||
|---|---|---|---|
|
#18+
Вообще-то для нахождения корня можно просто: select * from Tree where Root Is Null и дело с концом. Лично я рассматриваю эту операцию как повод иметь для нее свой собственный метод. Т.е. метод получения корня - отдельно, метод получения узлов, растущих из этого корня - отдельно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2004, 10:09 |
|
||
|
Как быть с ANSI NULLS ?
|
|||
|---|---|---|---|
|
#18+
To Hibernate: Спасибо, я начал улавливать смысл. :) А на счет "вставить две записи, значения одного из уникальных полей которых неизвестны на момент вставки" - это требование кажется мне вполне логичным. Наличие ключа (простого или составного - не суть важно) говорит о том, что он однозначно идентифицирует запись - сам смысл ключа в этом а иначе он не нужен. Так что серверу ты не объяснишь типа "я потом допишу отсутствующую инфу, не переживай". Дело в том, что найти конкретную запись по неполному ключу ты потом просто не сможешь ;)... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2004, 15:00 |
|
||
|
Как быть с ANSI NULLS ?
|
|||
|---|---|---|---|
|
#18+
2Сергей Базилевич: Unique Constraint не есть одно и тоже, что и Primary Key - уникальное поле необязательно входит в Key таблицы. Хотя, конечно, я согласен, что это быстрее всего, мои тараканы :-) И разработчики сервера правы. Хотя явное какое-то несоответствие: когда мы сравниваем NULL c другим NULL - получаем NULL. А вот когда это делает Unique Constraint, то он вполне получает True или False....и у него такой результат получается невзирая ни на какие там всякие установки ANSI NULL... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2004, 17:29 |
|
||
|
Как быть с ANSI NULLS ?
|
|||
|---|---|---|---|
|
#18+
Это точно, с NULL надо быть поаккуратнее. Я например долго не мог вьехать, почему у меня в Sybase ASA проходил следующий CHECK на NULL поля: Код: plaintext при заносе значений Field1=NULL и Field2=1 данный CHECK срабатывал, хотя по идее должна быть ошибка. Как выяснилось из BOL, оказывается, назло всем остальным правилам работы с NULL, для CHECK состояние UNKNOW означает TRUE. Условие Field=1 генерировало UNKNOW и условие возвращало TRUE. Так что переписав код все правильно заработало: Код: plaintext С одной стороны это правильно, например есть у меня NULL поле и я проверяю, чтобы оно было в определенных границах: Код: plaintext Логично предположить, что если я указал, что поле может содержать NULL, то значит CHECK не должен содержать в себе лишние проверки на NULL, что и сделано в ASA. С другой стороны забыв об этом можно написать по "привычке" работы с NULL и споткнуться, что я собственного говоря и сделал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2004, 17:49 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=32388175&tid=1546655]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
179ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
2ms |
| others: | 285ms |
| total: | 564ms |

| 0 / 0 |
