![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SQL-запрос в Access [D7, XP]
WorkWork © (2011-09-13 02:31:00)Привет! работаю с БД Access. Нужно отобрать записи, в которых поля пустые(тип - строка). Пишу такой запрос:
SELECT *
FROM Obrazovanie
WHERE ((Period="")and(Naimen="")and(Spec="") and (Prim=""))
Не выдает ни одной строчки, хотя в базе такие есть. Пробывал с одиночными апострофами, ставил Null никак не хочит выполнять. Как в Access написать такой запрос грамотно, чтобы сработал?
И. Павел (2011-09-13 13:21:00) [1]
> WorkWork
Запретите значение NULL для тех полей, в которых оно не используется. И расставьте вторичные ключи. Иначе с ростом базы еще бОльшие чудеса могут пойти.
Anatoly Podgoretsky (2011-09-13 11:23:00) [2]
> Если запрос возвращает пустую выборку, это значит, что в
> базе нет ни одной записи, удовлетворяющей условию отбора.
Так он даже запрос построить не может и отладку провести тоже.
Anatoly Podgoretsky (2011-09-13 11:14:00) [3]> WorkWork (13.09.2011 09:41:14) [14]
Пустые говоришь, так пустые это NULL, а с пробелами не пустые.
Медвежонок Пятачок (2011-09-13 11:07:00) [4]не, похоже я просто не заменил файл после апдейта.
последний скриншот - это как раз оригинальная база.
в поле период пустая строка, в остальных полях нулл.
Inovet (2011-09-13 11:04:00) [5]> [35] Медвежонок Пятачок © (13.09.11 10:52)
> если бы была простая смесь пустых строк и нуллов, то картинка была бы иная.
Значит автор врал
> [1] MonoLife © (13.09.11 04:35)
> IS NULL
> [2] WorkWork (13.09.11 05:08)
> Тоже неработает (((
Автору. Ну так теперь будет понимание разницы, а оно ещё глубже чем может показаться сразу.
Медвежонок Пятачок (2011-09-13 10:52:00) [6]если бы была простая смесь пустых строк и нуллов, то картинка была бы иная.
вот выборка, с проапдейтенным полем Период в пустую строку для id in (57,58)
http://img24.imageshack.us/img24/7967/nulll.png
Inovet (2011-09-13 10:48:00) [7]> [31] Омлет © (13.09.11 10:32)
> Наоборот. В PeriodO там пустая строка, в остальных - null
Как и предполагалось, судя по постам автора, непонимание разницы между null и ''.
WorkWork (2011-09-13 10:48:00) [8]Спасибо ребят очень помогли и понятно описали!!!
Медвежонок Пятачок (2011-09-13 10:42:00) [9]запрос на исходном файле:
select ID,len(periodo), len(naimen), len(spec), len(prim)
from Obraz
результат:
http://img571.imageshack.us/img571/5176/nullb.png
по картинке как бы видно, что везде как бы нулл.
после апдейта например периода на пустую строку в столбце видна нулевая длина.
так что версия с юникодным мусором побеждает.
Омлет (2011-09-13 10:32:00) [10]> Медвежонок Пятачок © (13.09.11 10:29) [27]
> в периоде был честный нулл. а остальных где-то был мусор.
Наоборот. В PeriodO там пустая строка, в остальных - null.
Медвежонок Пятачок (2011-09-13 10:32:00) [11]учебник хорошо.
но этого мало.
если перефразировать одного персонажа, то я бы сказал так:
если выборка дает пусто, а глаза видят, что записи есть, то выколи себе глаза и верь выборке.
sniknik (2011-09-13 10:30:00) [12]> Что и требовалось доказать.
т.е. как ожидалось путаница и бардак в данных
тогда вместо
SELECT *
FROM Obrazovanie
WHERE ((Period="")and(Naimen="")and(Spec="") and (Prim=""))
"универсальный" способ
SELECT *
FROM Obrazovanie
WHERE (Trim(Period)="" or Period is NULL) and (Trim(Naimen)="" or Naimen is NULL) and (Trim(Spec)="" or Spec is NULL) and (Trim(Prim)="" or Prim is NULL)
Омлет (2011-09-13 10:29:00) [13]> WorkWork
Учебник кипи уже, если не отличаешь пустую строку от NULL.
Медвежонок Пятачок (2011-09-13 10:29:00) [14]да нет, там же поля widestring
в периоде был честный нулл. а остальных где-то был мусор.
причем в датасете весь мусор приводился либо к нулу либо к пустой строке.
вот такое выдавало пустые строки на всех полях
With ADODataSet1 do
begin
First;
while not eof do
begin
Memo1.Lines.Add('"' + varToStr(FieldValues['Naimen'])+'"');
Next;
end;
end;
а движок-то видит, что в полях не пусто.
Омлет (2011-09-13 10:25:00) [15]
select * from Obraz
where ((trim(PeriodO) = "") or (PeriodO is NULL)) and
((trim(Naimen) = "") or (Naimen is NULL)) and
((trim(Spec) = "") or (Spec is NULL)) and
((trim(Prim) = "") or (Prim is NULL));
Медвежонок Пятачок (2011-09-13 10:20:00) [16]Что и требовалось доказать.
1. update Obraz set PeriodO = null where ID = 57 or ID = 58
2. update Obraz set naimen = null, spec = null, prim = null
select * from Obraz
where PeriodO is null
and naimen is null
and spec is null
and prim is null
2 (две) строки в выборке.
Не верь глазам своим, но верь движку.
WorkWork (2011-09-13 10:09:00) [17]Это я для наглядности так написал в форуме
WorkWork (2011-09-13 10:08:00) [18]Да без разници в принципе. Period0 - там вконце буква O
Медвежонок Пятачок (2011-09-13 10:05:00) [19]И таблица не образование, а образ
Медвежонок Пятачок (2011-09-13 10:04:00) [20]Косяк в твоем поле период, которое не период, а Period0