-
-
> pooh001 (17.03.2012 22:32:00) [0]
Почему WHERE UPPER(Name)=UPPER("имя"), а не WHERE UPPER(Name)="ИМЯ"
-
Потому, что пользователь вводит параметры запроса через едит и в основном без учета регистра, а в базе информация хранится в произвольном регистре. хотелось более красиво решить эту проблему, без принудительного изменения регистра. Не очень красиво получится если хранить все в базе в одном регистре и переводить все что ввел пользователь в тот же регистр в простейшем виде запрос в программе происходит так: ABSQuery.SQL.Clear;
ABSQuery.SQL.Add('SELECT Name,ID FROM tTable WHERE Name LIKE :pName + \"%\"');
ABSQuery.ParamByName('pName').AsString := edName.Text;
ABSQuery.SQL.Open;
-
Это уже совсем другой запрос, ты специально запутываешь?
-
>pooh001 © (17.03.12 23:10) [2] >Не очень красиво получится если хранить все в базе в одном регистре в чем "некрасота"?
-
> в чем "некрасота"? вообще, если есть регистро-независимый(/любой) индекс, и он по какой то причине не работает, то это действительно не хорошо...
-
Не красота в том, что теряется гибкость. получается как-то тапорно когда все символы одного регистра. ИВАНОВ ИВАН ИВАНОВИЧ и Ивинов Иван Иванович, помоему есть разница. В БД есть механизмы отключения регистра, просто я не знаю как их задействовать. И с индексом не могу разобраться. У меня щас вот так: ABSQuery.SQL.Clear; ABSQuery.SQL.Add('SELECT Name,ID FROM tTable WHERE UPPER(Name) LIKE UPPER(:pName) + "%"'); ABSQuery.ParamByName('pName').AsString := edName.Text; ABSQuery.SQL.Open; но когда объем данных увеличивается, начинает подтормаживать. Anatoly Podgoretsky, я не запутываю, просто сразу не уточнил что запрос немного более универсален, пардон.
-
> У меня щас вот так: ВНИМАТЕЛЬНО, прочитай Anatoly Podgoretsky © (17.03.12 22:49) [1], ПОДУМАЙ, а потом ответь.
-
> > У меня щас вот так: > ВНИМАТЕЛЬНО, прочитай Anatoly Podgoretsky © (17.03.12 > 22:49) [1], ПОДУМАЙ, а потом ответь.
я внимательно прочитал. отвечаю:потому, что пользователь "БОГ", ему разрешено вводить данные в любом регистре. Программа не препятствует ему. она насильно не повышает регистр символов в едите. Тогда можно было обойтись и без UPPERа, просто хранить все в базе в верхнем регистре и насильно переводить вводимые пользователем данные в верхний.
сделал так(немного пошустрела скорость формирования запроса):
> procedure ......................; > function mUpperCase(s: string): string; > var > i: integer; > begin > result := s; > for i := 1 to length(result) do > if (result[i] in ['a'..'z', 'а'..'я']) > then result[i] := chr(ord(result[i]) - 32); > end; > begin > ABSQuery.SQL.Clear; > ABSQuery.SQL.Add('SELECT Name,ID FROM tTable WHERE UPPER(Name) > LIKE :pName + "%"'); > ABSQuery.ParamByName('pName').AsString := mUpperCase(edName. > Text); > ABSQuery.SQL.Open;end; > end;
убрал один UPPER и перенес его в едит. да,работает немного быстрее, но не решает проблемы реализации регистронезависимого запроса. это все обход регистра с помощью ухищрений. но ведь это может сделать и сама БД. по крайней мере должна уметь это сделать. может кто сталкивался как заставить ее это сделать.....
|