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-20 12:57:00) [1]


> Inovet ©   (20.03.12 12:29) [38]
> Ты создай таблицу и индекс не из визуальной прилады, а запросом,
>  для начала. Потм с локалью посмотри в запросе DDL же.


Создавал индекс тремя способами 1)при создании файла БД 2) с помощью TABSTable 3) с помощью запроса SQL(в исходнике прикрепленном выше это есть). Ни в одном случае не помогло.

Создавал запросом таблицу и индекс как описано на оффсайте ( http://www.componentace.com/sql/create-index.htm), только последнюю строчку заменил на select name,code from developers where name="janet" order by name; не находит он жанету. меняю name="Janet"(с большой буквы)-находит.

спасибо за советы. если разберусь напишу в чем была проблема.


Inovet   (2012-03-20 12:29:00) [2]

> [37] pooh001 ©   (20.03.12 12:23)

Ты создай таблицу и индекс не из визуальной прилады, а запросом, для начала. Потм с локалью посмотри в запросе DDL же.


pooh001   (2012-03-20 12:23:00) [3]


> sniknik ©   (19.03.12 22:16) [29]
>
> чего там урезано? минута "брожения"  на сайте по данной
> ссылке
> http://www.componentace.com/sql/create-index.htm
> ... for field "name" sorting order is descending and is
> case-insensitive.  ...
>
> это ДОЛЖНО работать, единственное проверить локализацию,
>  т.е. сначала английские слова в разных регистрах, убедится
> что действительно работает, а после туда же русские добавить
> и проверить...
> еще раз убедится, т.к. вот тут это написано прямым текстом
> http://www.componentace.com/absolute_database_features.htm
> Internationalization / localization support by use of current
> system locale


пробовал тот пример по первой ссылке. у меня билин не работает это. И не устанавливается у меня ixCaseInsensitive хоть тыбилин лопни. Какую-то мелочь упускаю видимо.
Пробовал как ты сказал "сначала английские слова в разных регистрах" - не работает. Фильтры работают красиво. Запрос нет.
Про локализацию смутно знаю. если это:

> - кодовый набор
>  - схема сортировки
>  - классификация символов
>  - числовое (не денежное) форматирование
>  - денежное форматирование
>  - форматирование даты и времени
>  - сообщения

То все установлено по умолчанию (OS Windows 7 Ultimate Russian x86)

Наверное возьму переводчик, и попробую написать им в поддержку.


Inovet   (2012-03-20 12:00:00) [4]

> [34] Кщд   (20.03.12 10:39)

Да. Про адрес эл. почты не я писал, если что.


Inovet   (2012-03-20 11:58:00) [5]

> [34] Кщд   (20.03.12 10:39)

В общем ShorName надо для таких случаев. Всё уже придумано.


Кщд   (2012-03-20 10:39:00) [6]

>Inovet ©   (20.03.12 10:30) [33]
>В печатных и электронных документах навименования должно быть в >соответсвии правилами языка и, например, учредительных документов,

в Кщд   (20.03.12 09:25) [32]:
"там, где это принципиально важно - можно" - и нужно
"но, простите, поступать так, например, с email - на мой взгляд, неоправданно"


Inovet   (2012-03-20 10:30:00) [7]

> [32] Кщд   (20.03.12 09:25)

Про производительность согласен, если нет возможности. а вот с "и, если честно, вообще не аргумент" - не согласен. В печатных и электронных документах навименования должно быть в соответсвии правилами языка и, например, учредительных документов, данных паспорта, не помню, есть ли такое требование в законодательстве.

Другое дело, что для поиска можно сделать второе наименование, и даже нужно. Вот в это поле и писать что угодно-удобно. Лучше видеть отсортированным по названию, чем по ООО, ОАО, ЧП и т.п.. Это для примера, конечно. Для адреса емайл такое ни к чему.


Кщд   (2012-03-20 09:25:00) [8]

>Inovet ©   (19.03.12 11:47) [20]
>Ну так действительно "тапорно". Где-то в отчётах лучше видеть ООО "Родинов продакшн"

если нет индексов по выражению или регистронезависимых, то "как-то тапорно" не аргумент против падения производительности на запросах where NAME = :p.
и, если честно, вообще не аргумент)
там, где это принципиально важно - можно, как было предложено, хранить в доп. поле в upper(lower) case или в виде хэша(md5)
но, простите, например поступать так, например, с email - на мой взгляд, неоправданно
если есть контрпримеры, с удовольствием выслушаю


Inovet   (2012-03-19 22:37:00) [9]

> [27] pooh001 ©   (19.03.12 20:27)
> Думаю компоненты Absolute DB есть у всех

Ты очень самоуверен.


sniknik   (2012-03-19 22:20:00) [10]

> Думаю компоненты Absolute DB есть у всех
оптимист. и даром не надь... (ставить левые компоненты в систему)


sniknik   (2012-03-19 22:16:00) [11]

чего там урезано? минута "брожения"  на сайте по данной ссылке
http://www.componentace.com/sql/create-index.htm
... for field "name" sorting order is descending and is case-insensitive.  ...

это ДОЛЖНО работать, единственное проверить локализацию, т.е. сначала английские слова в разных регистрах, убедится что действительно работает, а после туда же русские добавить и проверить...
еще раз убедится, т.к. вот тут это написано прямым текстом
http://www.componentace.com/absolute_database_features.htm
Internationalization / localization support by use of current system locale


pooh001   (2012-03-19 20:37:00) [12]


> Anatoly Podgoretsky ©   (19.03.12 12:42) [25]
>
> CREATE TABLE:
> ...
> and index_definition is:
>   [, PRIMARY [ KEY ] [ index_name ] ( column_name  [ ASC
> | DESC ]  [ CASE | NOCASE ]  [, ... ] ) ]
>   [, [ UNIQUE ] [INDEX] [index_name] ( column_name  [ ASC
> | DESC ]  [ CASE | NOCASE ]  [, ... ] ) ]


Anatoly Podgoretsky, спасибо, но не работает. Там свой более урезанный язык SQL. В примере (ссылку дал выше),создается индекс 2мя спопобами. c помощью TABSTable и с помощью SQL запроса, в обоих случаях задается нечувствительность к регистру, но она почему-то не работает на деле. Может я чето упускаю. Пол дня сидел на примере все перебирал, пробовал несколько разных версий компонентов, все одно и тоже. Не пойму что я упускаю...


pooh001   (2012-03-19 20:27:00) [13]

Использую локальный файл БД. Файл БД был создан с помощью утилиты DBManager. Все таблицы, индексы били созданы с помощью нее же. Не знаю правильно это или нет, но в фале БД все индексы ixCaseInsensitive=true, а программа уже не видит это свойство, т.е. для нее ixCaseInsensitive=false. Фильтры работают нормально, foCaseInsensitive=true и чувствительности к регистру как не бывало. Но необходима отсутствие чувствительности к регистру именно в запросах SQL.
Чтоб было наглядно сделал небольшой исходничек, чтоб более "напальцах" показать все на примере. Кому не лень посмотрите.
Ссылка: _ http://www.fayloobmennik.net/1682255
Думаю компоненты Absolute DB есть у всех (_ http://www.componentace.com/download/download.php?editionid=1)


Anatoly Podgoretsky   (2012-03-19 12:45:00) [14]

>   ()  []

MS SQL все нормально работает без дополнительных полей, главное указать
правильный Location


Anatoly Podgoretsky   (2012-03-19 12:42:00) [15]

CREATE TABLE:
...
and index_definition is:

 [, PRIMARY [ KEY ] [ index_name ] ( column_name  [ ASC | DESC ]  [ CASE | NOCASE]  [, ... ] ) ]

 [, [ UNIQUE ] [INDEX] [index_name] ( column_name  [ ASC | DESC ]  [ CASE | NOCASE]  [, ... ] ) ]


знайка   (2012-03-19 12:34:00) [16]

Microsoft, например, до сих пор так предлагает иногда.
Вот есть у них заготовка для менеджмента пользователей, так там в таблице
aspnet_Membership есть такие поля:
Email nvarchar(256)
LoweredEmail nvarchar(256)


sniknik   (2012-03-19 12:24:00) [17]

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


знайка   (2012-03-19 12:20:00) [18]

Еще иногда делают рядом доп. поле где тоже имя хранят в каком-то одном кэйсе, и поиск ведут по нему.


sniknik   (2012-03-19 12:15:00) [19]

не читая справку, не зная/не работая с Absolute Database, вижу подвох вот тут
> создал индекс, поставил CaseInsensitive в true
индекс создан, и создан "на сервере", а "поставил CaseInsensitive" подразумевает, прямо таки напрашивается клиент... т.е. ограниченное локально действие.
хотя, утверждать по столь красочному, и абсолютно технически безграмотному описанию "создания", ничего нельзя конечно.

> я недавно начал изучать БД, да и Delphi
извините, был пьян, за рулем только неделю, поэтому и разгромил ваш магазин... не судите строго...

блин, и почему не в начинающих?


Inovet   (2012-03-19 11:47:00) [20]

> [18] Кщд   (19.03.12 07:39)
> я спрашивал, что "некрасивого" в том, чтобы хранить всё
> в одном регистре.

Ну так действительно "тапорно". Где-то в отчётах лучше видеть ООО "Родинов продакшн", чем в одном регистре, и поправить можно регистр, если что не так.


Страницы:   1 2

Наверх

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