Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SQL-запрос в Access [D7, XP]


Страницы:   1 2

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо