Текущий архив: 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.47 MB
Время: 0.006 c