АХТУНГ!!! Where [Поле] = Null
Лох Позорный
Дата: 25.05.2004 11:31:54
В недрах унаследованного софта (Access 97) нашел такой кусочек кода:
Set rst = CurrentDb.OpenRecordset("Select * From [Таблица] Where [Поле]=Null")
И эта собака дикая - работает!!! Причем работает так, как (по всей видимости) задумывал неизвестный педераст - автор этой программы. Т.е. в полученном рекордсете содержаться записи, в которых [Поле] Is Null
Обнаружил при переходе на Access 2002, который интерпретируют "[Поле]=Null" правильно, т.е. False при любом значении (в том числе отсутствии значения) в Поле
Это глюк? Фича? Или это я америку открыл и на граблю наступил?
З.Ы. Почему нет блюющего смайлика?
paparome
Дата: 25.05.2004 11:38:02
| | автор |
| | который интерпретируют "[Поле]=Null" правильно, т.е. False |
Не знаю как в Аксе, но, вообще-то он не в false преобразовывает, а в Null
Можно проверить
1. ([поле]=Null) = false
2. ([поле]=Null) is null
ЗЫ: проверил - 1 первый вариант не выдает полей, а 2 - выдает все :)
Лох Позорный
Дата: 25.05.2004 11:44:35
Сори
Сравнение с Null'ом дает в итоге не False, конечно же, а Null
Суть от этого не меняется. Null в предложении Where записей выводить не должен.
Однако в 97-ом аксесе - сравнение с Null'ом (=Null) работает как проверка на Null (Is Null)
Хочу блюющий смайлик. Как представлю, сколько таких мест еще осталось...
paparome
Дата: 25.05.2004 11:48:06
2 ЛП
В MSSQL есть спец опция:
SET ANSI_NULLS ON|OFF
Вот она как раз такое и проделывает
Т.е. если ON, то сравнение с NULL допустимы, иначе чисто NULL будет возвращать :)
Может для 97 ANSI стандарт ближе?
TriAxp
Дата: 25.05.2004 14:03:53
Q237992
SYMPTOMS
When using an SQL statement with a WHERE clause that contains a test for NULL using the = operator, records that match the query are not returned in the recordset.
These queries worked correctly with Jet 3.5 and returned the records as expected.
This behavior will only be exhibited on computers with MDAC 2.1 and later that have Jet 4.0 installed.
CAUSE
Jet 4.0 made some changes to the SQL syntax and is now more SQL ANSI 92 compliant than before. Especially SQL ANSI 92 NULL behavior was implemented. Also remember that the result of a Boolean expression can have three results - TRUE, FALSE and NULL (in some documents referred as UNKNOWN).
RESOLUTION
Use the IS keyword in queries that test for NULL. This change will not break on systems with Jet 3.5 as Jet 3.5 accepted both types of queries.
STATUS
This behavior is by design.
Лох Позорный
Дата: 25.05.2004 14:18:06
Ну вот, опять меня носом в хелп ткнули

Однако непонятен мне такой
by disignОткуда вообще взялось в 97-м аксесе сравнение с Null'ом через знак равенства? В целях совместимости со 2-м аксесом что-ли?
Кто-нибудь Access 2.0 помнит? Или 1.0? Может там не было слова
Is, потому через "
=" и сделали?
Владимир Саныч
Дата: 25.05.2004 14:24:06
Я начинал на Аксессе Втором. Но сколько себя помню - всегда знал, что нельзя писать =Null. Впрочем, возможно, у меня это сидит в голове из хелпа про VBA, в котором это касалось ифов. А на селекты я распространил сам... ХЗ.