![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
регистронезависимый запрос SQL (Absolute DB или Accuracer) [D7, Absolute DB]
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)
> я спрашивал, что "некрасивого" в том, чтобы хранить всё
> в одном регистре.
Ну так действительно "тапорно". Где-то в отчётах лучше видеть ООО "Родинов продакшн", чем в одном регистре, и поправить можно регистр, если что не так.