Конференция "Базы" » регистронезависимый запрос SQL (Absolute DB или Accuracer) [D7, Absolute DB]
 
  • pooh001 © (17.03.12 22:32) [0]
  • Anatoly Podgoretsky © (17.03.12 22:49) [1]
    > pooh001  (17.03.2012 22:32:00)  [0]

    Почему WHERE UPPER(Name)=UPPER("имя"), а не WHERE UPPER(Name)="ИМЯ"
  • pooh001 © (17.03.12 23:10) [2]
    Потому, что пользователь вводит параметры запроса через едит и в основном без учета регистра, а в базе информация хранится в произвольном регистре. хотелось более красиво решить эту проблему, без принудительного изменения регистра. Не очень красиво получится если хранить все в базе в одном регистре и переводить все что ввел пользователь в тот же регистр

    в простейшем виде запрос в программе происходит так:
    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 © (18.03.12 00:27) [3]
    Это уже совсем другой запрос, ты специально запутываешь?
  • Кщд (18.03.12 08:59) [4]
    >pooh001 ©   (17.03.12 23:10) [2]
    >Не очень красиво получится если хранить все в базе в одном регистре
    в чем "некрасота"?
  • sniknik © (18.03.12 10:57) [5]
    > в чем "некрасота"?
    вообще, если есть регистро-независимый(/любой) индекс, и он по какой то причине не работает, то это действительно не хорошо...
  • pooh001 © (18.03.12 15:14) [6]
    Не красота в том, что теряется гибкость. получается как-то тапорно когда все символы одного регистра. ИВАНОВ ИВАН ИВАНОВИЧ и Ивинов Иван Иванович, помоему есть разница. В БД есть механизмы отключения регистра, просто я не знаю как их задействовать. И с индексом не могу разобраться.
    У меня щас вот так:
    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 © (18.03.12 17:57) [7]
    > У меня щас вот так:
    ВНИМАТЕЛЬНО, прочитай Anatoly Podgoretsky ©   (17.03.12 22:49) [1], ПОДУМАЙ, а потом ответь.
  • pooh001 © (18.03.12 18:58) [8]

    > > У меня щас вот так:
    > ВНИМАТЕЛЬНО, прочитай 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 и перенес его в едит. да,работает немного быстрее, но не решает проблемы реализации регистронезависимого запроса. это все обход регистра с помощью ухищрений. но ведь это может сделать и сама БД. по крайней мере должна уметь это сделать. может кто сталкивался как заставить ее это сделать.....
 
Конференция "Базы" » регистронезависимый запрос SQL (Absolute DB или Accuracer) [D7, Absolute DB]
Есть новые Нет новых   [134431   +10][b:0][p:0.001]