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

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

регистронезависимый запрос SQL (Absolute DB или Accuracer) [D7, Absolute DB]


Страницы:   1 2

pooh001 ©   (2012-03-17 22:32:00) 

Помогите разобраться как реализовать регистронезависимый запрос в Absolute DB или Accuracer DB), у меня есть таблица tTable:

ID Name
1 имя
2 ИМЯ
3 Имя
4 иМя
5 имЯ

есть индекс iNoCase в котором отключена чувствительность к регистру для поля Name.

реализую простейший запрос через TABSQuery

ABSQuery.SQL.Clear;
ABSQuery.SQL.Add('SELECT Name,ID FROM tTable WHERE Name="имя"');
ABSQuery.SQL.Open;

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

UPPER не подходит для решения проблемы. если сделать так: SELECT Name,ID FROM Table WHERE UPPER(Name)=UPPER("имя"), начинает заметно тормозить.


pooh001   (2012-03-19 11:21:00) [21]


> Anatoly Podgoretsky ©   (18.03.12 22:18) [17]
> Мне больше времени пришлось потратить что бы найти справку
> по AbsDB, чем на получения ответа. Ответы там лежат на поверхности


Anatoly Podgoretsky, я немецкий в школе изучал, а справка вся на английском, может чето упустил, может чето не правильно делаю 1) Создал БД. 2) Создал таблицу 3) создал индекс, поставил CaseInsensitive в true. 4) В проекте кинул на форму: ABSDatabase, ABSTable, ABSQuery. Подключил их все. ABSTable.IndexName:=<мой индекс>. 5)Затем формирую запрос. Но он все равно чувствует регистр. И что странно в ABSTable.IndexDefs[<индекс>].Options = [] не отмечен ixCaseInsensitive.
Может и не правильно чето делаю, я недавно начал изучать БД, да и Delphi


Кщд   (2012-03-19 07:39:00) [22]


> sniknik ©   (18.03.12 10:57) [5]
> вообще, если есть регистро-независимый(/любой) индекс, и
> он по какой то причине не работает, то это действительно
> не хорошо...

если есть и не работает - баг, либо руки. тут всё понятно.
я спрашивал, что "некрасивого" в том, чтобы хранить всё в одном регистре.

>pooh001 ©   (18.03.12 15:14) [6]
>получается как-то тапорно когда все символы одного регистра.
исчерпывающе


Anatoly Podgoretsky   (2012-03-18 22:18:00) [23]

Мне больше времени пришлось потратить что бы найти справку по AbsDB, чем на получения ответа. Ответы там лежат на поверхности


sniknik   (2012-03-18 22:07:00) [24]

> не пойму что за наезды?
это не наезды, это ты "тупишь". причем в очевидном, а до разбирательства собственно "не работы индекса" так понимаю вообще не дойдет.

> Программы делаются для людей, и они должны быть как можно более дружелюбны.
то, про, что  говорили с интерфейсом ВООБЩЕ не связано. только с запросом/индексами, нет какие то "едиты" приплел.

> Ты справку бы прочитал по данной функции.
он ответил заранее
> В справке толком ничего не нашел((


Anatoly Podgoretsky   (2012-03-18 22:00:00) [25]

Главное непонятны мучения, когда индекс может быть нечувствителен к регистру.


Anatoly Podgoretsky   (2012-03-18 21:48:00) [26]


> Стандартная функция UpperCase не переводит в верхний регистр
> кириллицу.

Ты справку бы прочитал по данной функции.


Anatoly Podgoretsky   (2012-03-18 21:46:00) [27]


> pooh001 ©   (18.03.12 18:58) [8]

Уже третий код. И зачем ты это делаешь?


pooh001   (2012-03-18 21:39:00) [28]


> знайка   (18.03.12 21:01) [9]
> в справке должно быть описано

В справке толком ничего не нашел((


> sniknik ©   (18.03.12 21:02) [10]
> sniknik ©   (18.03.12 21:05) [11]

не пойму что за наезды? едит это TEdit. боги тут не причем, это метафора. Программы делаются для людей, и они должны быть как можно более дружелюбны.
Не имею желания всупать в конфликты, в поте лица доказывать что сделал я что не я. Функцию mUpperCase нашел в DRKB. Нафига? Стандартная функция UpperCase не переводит в верхний регистр кириллицу.


sniknik   (2012-03-18 21:05:00) [29]

> сделал так(
сделал, или тебе сделали? на параллельном форуме где ты еще этот же вопрос задал... даже цитирование не убрал.
что там за функция такая mUpperCase? объясни нафига? если сам делал.


sniknik   (2012-03-18 21:02:00) [30]

> убрал один UPPER и перенес его в едит.
???
какой еще едит? при чем тут "боги" и едиты, тебе про запрос говорили, и только.
+
запрос в [0] <> всем последующим. а LIKE кстати и в нормальных базах не всегда индекс использует, а в "твоей" еще вообще вопрос...


знайка   (2012-03-18 21:01:00) [31]

в справке должно быть описано


pooh001   (2012-03-18 18:58:00) [32]


> > У меня щас вот так:
> ВНИМАТЕЛЬНО, прочитай 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 и перенес его в едит. да,работает немного быстрее, но не решает проблемы реализации регистронезависимого запроса. это все обход регистра с помощью ухищрений. но ведь это может сделать и сама БД. по крайней мере должна уметь это сделать. может кто сталкивался как заставить ее это сделать.....


sniknik   (2012-03-18 17:57:00) [33]

> У меня щас вот так:
ВНИМАТЕЛЬНО, прочитай Anatoly Podgoretsky ©   (17.03.12 22:49) [1], ПОДУМАЙ, а потом ответь.


pooh001   (2012-03-18 15:14:00) [34]

Не красота в том, что теряется гибкость. получается как-то тапорно когда все символы одного регистра. ИВАНОВ ИВАН ИВАНОВИЧ и Ивинов Иван Иванович, помоему есть разница. В БД есть механизмы отключения регистра, просто я не знаю как их задействовать. И с индексом не могу разобраться.
У меня щас вот так:
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, я не запутываю, просто сразу не уточнил что запрос немного более универсален, пардон.


sniknik   (2012-03-18 10:57:00) [35]

> в чем "некрасота"?
вообще, если есть регистро-независимый(/любой) индекс, и он по какой то причине не работает, то это действительно не хорошо...


Кщд   (2012-03-18 08:59:00) [36]

>pooh001 ©   (17.03.12 23:10) [2]
>Не очень красиво получится если хранить все в базе в одном регистре
в чем "некрасота"?


Anatoly Podgoretsky   (2012-03-18 00:27:00) [37]

Это уже совсем другой запрос, ты специально запутываешь?


pooh001   (2012-03-17 23:10:00) [38]

Потому, что пользователь вводит параметры запроса через едит и в основном без учета регистра, а в базе информация хранится в произвольном регистре. хотелось более красиво решить эту проблему, без принудительного изменения регистра. Не очень красиво получится если хранить все в базе в одном регистре и переводить все что ввел пользователь в тот же регистр

в простейшем виде запрос в программе происходит так:
ABSQuery.SQL.Clear;
ABSQuery.SQL.Add('SELECT Name,ID FROM tTable WHERE Name LIKE :pName + "%"');
ABSQuery.ParamByName('pName').AsString := edName.Text;
ABSQuery.SQL.Open;


Anatoly Podgoretsky   (2012-03-17 22:49:00) [39]

> pooh001  (17.03.2012 22:32:00)  [0]

Почему WHERE UPPER(Name)=UPPER("имя"), а не WHERE UPPER(Name)="ИМЯ"


Страницы:   1 2

Наверх

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