![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите составить запрос [D7, dBase, FoxPro]
Dell3r © (2005-05-17 11:57:00)В сомбобоксе вводится слово. в процессе ввода нужно оставлять записи соответствующие вводимым символам без учета регистра
Я пишу:
procedure TForm.CBNameKeyPress(Sender: TObject; var Key: Char);
Memo1.Lines.Strings[1]:='Where Name like "%'+CBName.Text+'%"';
QueryTMC.SQL.Assign(Memo1.lines);
QueryTMC.Open;
Вроде всё работает но если ввожу слово "лада", то среди записей есть "Влад"
Sergey13 (2005-05-17 12:21:00) [21]2[10] ANB © (17.05.05 12:18)
Так вроде можно индекс по функции сделать. Я правда не пробовал - у меня стандарт эдишн был.
ANB (2005-05-17 12:20:00) [22]
> А почему нельзя просто
- потому что в поле у него может быть в нижнем. Тоже самое, если написать '%ЛАДА%'. А ошибка будет прежней. Без словарика тут не обойтись.
Кстати, а зачем здесь посредник Memo1 ???
msguns (2005-05-17 12:18:00) [23]Да, только приведенный мною пример будет выбирать записи, у которых строки начинаются на текст комбобокса. Если надо начхать на регистр, то слева и справа предиката добавить LOWER или UPPER
Однако, как я понял из [4], это не устроит. В этом случае ничего лучше, чем сканировать НД на предмет вхождения подстроки в строку для лок.БД я не знаю.
ANB (2005-05-17 12:18:00) [24]
> А причем здесь скала с оруклом ?
- да это для примера. Local SQL тоже не умеет регистр игнорить. В Oracle я завожу доп поле. В триггере заношу в него строку в верхнем регистре из основного и цепляю на него индекс. Как он будет так с локальными БД изгалятся - не знаю. Особенно, если нужен поиск по словам. В принципе, у FoxPro есть индексы с формулами и можно применить функцию типа Upper (забыл как в фоксе она называется), но, кажись в DOS кодировке она не работала.
Sergey13 (2005-05-17 12:16:00) [25]А почему нельзя просто
Memo1.Lines.Strings[1]:='Where UPPER(Name) like "%'+AnsiUpperCase(CBName.Text)+'%"';
?
Dell3r (2005-05-17 12:14:00) [26]Я в sql не силён он ругается на From.
Насколько я понимаю нужно писать
Select * from base
where SUBSTRINR(Name FROM 1 FOR '+IntToStr(Length('лада'))+')='+QuotedStr('лада')
msguns (2005-05-17 12:12:00) [27]>ANB © (17.05.05 12:09) [6]
>SQL так не умеет. MS SQL, кажись, умеет регистр игнорить, а Oracle уже нет.
А причем здесь скала с оруклом ?
ANB (2005-05-17 12:09:00) [28]SQL так не умеет. MS SQL, кажись, умеет регистр игнорить, а Oracle уже нет. Придется тебе заводить служебное поле в верхнем регистре, а для поиска слов - отдельную таблицу-словарик.
msguns (2005-05-17 12:07:00) [29]SQL.ADD('.. WHERE SUBSTRINR(<Имя_поля> FROM 1 FOR '+IntToStr(Length(Combo.Text))+')='+QuotedStr(Combo.Text));
(Help+LocalSQL)
Dell3r (2005-05-17 12:06:00) [30]Если убрать в начале %, то поиск производится с начала записи.
А мне нужны так же записи "Экспо-лада"
Dell3r (2005-05-17 12:03:00) [31]А как без учета регистра Записей типа "Лада" там нету там только "лада"
ANB (2005-05-17 12:00:00) [32]И почитай про LIKE в хэлпе.
ANB (2005-05-17 11:59:00) [33]Так и должно быть. %лада% - все строки, содержащие лада. Убери % в начале.