Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.22;
Скачать: CL | DM;

Вниз

Проблема с SELECT... Help!   Найти похожие ветки 

 
pathfinder ©   (2003-05-01 18:56) [0]

Подскажите плиз в чем тут дело...
Есть 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 :(


 
Zacho ©   (2003-05-01 19:54) [1]

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


 
pathfinder ©   (2003-05-01 20:02) [2]

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


 
Zacho ©   (2003-05-01 20:21) [3]


> pathfinder © (01.05.03 20:02)

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


 
pathfinder ©   (2003-05-01 20:33) [4]


> 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:50) [5]


> pathfinder © (01.05.03 20:33)

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


 
Zacho ©   (2003-05-01 21:04) [6]

Кстати, сейчас подумал, что в твоем случае 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.


 
pathfinder ©   (2003-05-01 21:47) [7]


> 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:56) [8]


> pathfinder © (01.05.03 21:47)

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


 
pathfinder ©   (2003-05-01 22:15) [9]


> 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 22:36) [10]

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


 
Zacho ©   (2003-05-01 22:45) [11]

И еще попробуй просто сделать так:
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;


 
pathfinder ©   (2003-05-01 23:16) [12]


> Zacho ©


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







Страницы: 1 вся ветка

Текущий архив: 2003.05.22;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.01 c
14-70435
PVOzerski
2003-04-30 15:02
2003.05.22
как нормализовать ситуацию с телефоном


1-70325
Shadowofman
2003-05-08 17:27
2003.05.22
Совместная работа процедур KeyDown и OnTimer?


1-70388
Top Gun
2003-05-10 23:06
2003.05.22
Где описана функция assigned ?


8-70410
Racer
2003-01-27 23:14
2003.05.22
Видимые/невидимые линии


1-70278
wwwasya
2003-05-12 17:35
2003.05.22
Application.CreateForm vs TForm.Create