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

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

Проблема с SELECT... Help! [D6, IB6.x]


pathfinder ©   (2003-05-01 18:56:00) 

Подскажите плиз в чем тут дело...
Есть 2 таблицы sd и mp связь (один к одному) осущ. по полям sd_rdnum и mp_rdnum соответственно.
Необходимо выполнить поиск по 4 полям таблицы mp и получить данные из табл. sd.
если запрос выглядит так (поиск только по 2 полям):
select * from sd
where sd_rdnum in (select mp_rdnum from mp where mp_strana=:pS or mp_np=:pN)
то все номано...а если так:
select * from sd
where sd_rdnum in (select mp_rdnum from mp where mp_strana=:p0 or mp_subrf=:p1 or mp_raion=:p2 or mp_np=:p3)
то при вводе значения только одного поля выдаются все записи табл. sd :(


pathfinder   (2003-05-01 23:16:00) [1]


> Zacho ©


Большое спасибо за помощь!!!





Zacho   (2003-05-01 22:45:00) [2]

И еще попробуй просто сделать так:
if Trim(Edit1.Text)<>"" then Params[0].AsString:=edit1.Text else Params[0].Clear;
if Trim(Edit2.Text)<>"" then Params[1].AsString:=edit2.Text else Params[1].Clear;
if Trim(Edit3.Text)<>"" then Params[2].AsString:=edit3.Text else Params[2].Clear;
if Trim(Edit4.Text)<>"" then Params[3].AsString:=edit4.Text else Params[3].Clear;


Zacho   (2003-05-01 22:36:00) [3]

Какого типа поля mp_strana, mp_subrf, mp_raion, mp_np ?
Какой компонент используешь для запроса ?
После присвоения значений параметрам посмотри с помощью Param[].IsNull действительно ли в них NULL, если нет то посмотри Param[].Value


pathfinder   (2003-05-01 22:15:00) [4]


> Zacho ©

Params[0].AsString:=edit1.Text;
Params[1].AsString:=edit2.Text;
Params[2].AsString:=edit3.Text;
Params[3].AsString:=edit4.Text;
кстати, если edit не содержит текста то его св-во text будет ""?
а с конкретными значениями все ок...


Zacho   (2003-05-01 21:56:00) [5]


> pathfinder © (01.05.03 21:47)

Все-таки, что именно у тебя оказывается в параметрах "при вводе одного любого значения" ? Как именно ты присваиваешь значения параметрам ? И откуда их берешь ? В общем, посмотри, как выглядит твой запрос с конкретными значениями вместо параметров, и что он в таком случае возвращает.


pathfinder   (2003-05-01 21:47:00) [6]


> Zacho ©

при выполнении select mp_rdnum from mp where mp_strana=:p0 or mp_subrf=:p1 or mp_raion=:p2 or mp_np=:p3получается тоже самое при вводе одного любого значения возвр. все записи таблицы.


Zacho   (2003-05-01 21:04:00) [7]

Кстати, сейчас подумал, что в твоем случае IS NULL пожалуй ни причем, т.к. условие FIELD=NULL просто всегда будет false. Посмотри, что у тебя реально оказывается в параметрах при "пустом" значении, попробуй выполнить отдельно select mp_rdnum from mp where mp_strana=:p0 or mp_subrf=:p1 or mp_raion=:p2 or mp_np=:p3 посмотри, что он возвращает.
И переделай все-таки на JOIN.


Zacho   (2003-05-01 20:50:00) [8]


> pathfinder © (01.05.03 20:33)

А черт знает, но правильно все равно IS NULL


pathfinder   (2003-05-01 20:33:00) [9]


> Zacho ©

почему когда запрос выглядит так:
select * from sd
where sd_rdnum in (select mp_rdnum from mp where mp_strana=:pS or mp_np=:pN) все работает нормально несмотря на то, что я ввожу только одно значение (второе значение Null)?


Zacho   (2003-05-01 20:21:00) [10]


> pathfinder © (01.05.03 20:02)

Например, можно формировать запрос динамически, и включать в него только нужные условия. И, вроде бы, FIBPlus может автоматом заменять = на IS NULL
P.S. Твой запрос весьма не оптимален, вместо IN (SELECT .. лучше используй JOIN


pathfinder   (2003-05-01 20:02:00) [11]

2 Zacho
а как быть в том случае, если нужно, чтобы поиск можно было вести как по всем так и по одному или двум или трем любым полям?


Zacho   (2003-05-01 19:54:00) [12]

Что значит "при вводе значения только одного поля " ? Т.е. в одном из параметров p0,p1,p2,p3 какое-либо значение, а в остальных - NULL ? Если так, то читай какой-нибудь учебник по SQL. Для сравнения с NULL используется не = , а IS NULL.


Наверх

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