Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 978

/ вопрос открыт /

Здравствуйте!
У меня такой вопрос. Может он банальный, но все же.
Допустим в программе организован простенький запросик.

------------------------------
SELECT frName
FROM tRubrics
WHERE cfName LIKE "М%"
ORDER BY frName
------------------------------

В примере выше, запрос выдаст в виде результата все значения таблицы tRubrics, поле frName в которых начинается c БОЛЬШОЙ буквы М.

Вопрос следующий. Каким образом отключить чувствительность к регистру (именно при использовании SQL запроса). Чтобы результат вышеприведенного запроса содержал значения и верхнего и нижнего регистров (И [М] и [м]).
Предположим для BDE или ADO. Принципиальных различий по видимому быть не должно.

Я сделал следующее:
------------------------------
SELECT frName
FROM tRubrics
WHERE UPPER(cfName) LIKE UPPER("М%")
ORDER BY frName
------------------------------
Но таблица содержит большое кол-во записей, и запрос заметно тормозит.

Я читал что чувствительность к регистру можно отключать, но сам с этим вопросом еще не сталкивался ( и где читал найти не помню :-)).

Заранее благодарен.

Neva26 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Neva26 (статус: Посетитель)
Вопрос отправлен: 8 июля 2009, 20:35
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Neva26!
а написать так
SELECT frName
FROM tRubrics
WHERE (cfName LIKE "М%") or (cfName LIKE "m%")
ORDER BY frName

Кстати, а зачем в втором запросе UPPER("М%"). он точно не нужен.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 8 июля 2009, 21:12


Мини-форум вопроса

Всего сообщений: 10; последнее сообщение — 10 июля 2009, 19:23; участников в обсуждении: 4.
Dron

Dron (статус: Студент), 8 июля 2009, 21:26 [#1]:

Вообще, способ включения регистронезависимого поиска зависит от конкретной СУБД. Где-то вместо LIKE пишется ILIKE, где-то `field` ~* "text". Универсальный способ, как вы верно указали - приводить к верхнему/нижнему регистру и сранивать с шаблоном. Но этот способ может работать достаточно долго.
С уважением.
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 8 июля 2009, 22:38 [#2]:

вообще регистрозависимость зависит от настроек СУБД. Поэтому необходимо знать какая СУБД используется, а не от то, какие компоненты используются для доступа к СУБД
Neva26

Neva26 (статус: Посетитель), 8 июля 2009, 23:18 [#3]:

Вадим К Действительно. Можно сделать и так, но это не поможет если запрос будет скажем такой такой:

SELECT frName
FROM tRubrics
WHERE cfName LIKE "МаСл%"
ORDER BY frName

Вообще запрос формируется динамически:

SELECT frName
FROM tRubrics
WHERE cfName LIKE Edit1.Text + "%"
ORDER BY frName

...а пользователь в Edit1 может указать все что угодно.

А по поводу ["Кстати, а зачем в втором запросе UPPER("М%"). он точно не нужен."], он решал эту проблему переводя оба значения в верхний регистр, что приводило к их равенству при сходстве символов. Но как я уже писал это приводило к значительному увеличению времени формирования запроса.

На счет запроса не в курсе. Но знаю что при активации фильтра или поиске записей методом Locate компонента TTable можно отключить чувствительность к регистру (CaseInsensitive). А вот при формировании запроса не знаю как это сделать.

Даже при создании индексов полей таблицы есть возможность задать параметр Case Sensitive, но влияет ли он на запросы, и если да то каким образом его использовать в нем я не знаю.

Я только знаю что это возможно, знаю что есть программы в которых регистр в запросе не имеет значение, но каким образом это реализовать пока не знаю.

А по поводу используемой БД.
Я пока учусь используя обычный ADO. Но было бы интересно узнать и о том как это можно сделать используя SQLite, Accuracer, Absolute DataBase, если у кого-то с ними был опыт работы. Сам пока не опредилился что лучше.
Вадим К

Вадим К (статус: Академик), 9 июля 2009, 00:31 [#4]:

АДО - это не база, это движок.

Во вторых, "пользователь может ввести что угодно" - да, и надо не дать ему это сделать. как минимум - обрезать проблелы, регистр можно сразу подымать, а не что бы это делал движок ADO. (Trim и UpCase в помощь). И не делать запрос, если пользователь не ввел хотя бы три символа.

А также можно почитать о запросах здесь http://www.sql-ex.ru/help/select0.php?Lang=0
Галочка "подтверждения прочтения" - вселенское зло.
Neva26

Neva26 (статус: Посетитель), 9 июля 2009, 11:39 [#5]:

Действительно это движек а не база, но от этого думаю смысл вопроса не меняется. Скажу так "Я использую технологию ADO", если от этого изменится смысл сказанного.

Для меня важнее оставить этот запрос универсальным. Если жестко задать регистр для этого текстового поля (не важно верхний или нижний) проблемы это не решает.

Т.к. если запись таблицы БД состоит из символов и верхнего и нижнего регистров, а текстовое поле жестко привязано к определенному регистру, записи с аналогичным набором символов но разным регистром не будут равны.

Допустим если пользователь ищет запись таблицы "Запись1" и введет в текстовое поле "ЗАПИСЬ1" (все символы преобразуем в верхний регистр), запись не будет найдена т.к. запрос чувствителен к регистру.

В этом и заключается мой вопрос, "Каким образом отключить эту чувствительность".

Спасибо за ссылку [А также можно почитать о запросах здесь http://www.sql-ex.ru/help/select0.php?Lang=0] почитаю. И буду очень благодарен если найду то что меня интересует.
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 9 июля 2009, 17:48 [#6]:

Технология ADO - это только технология доступа к БД.
А обработку данных производит СУБД, соответственно и настройка чувствительности регистра зависит от используемой СУБД, а не технологии доступа. Поэтому и был вопрос о том, какую СУБД используете.
Neva26

Neva26 (статус: Посетитель), 10 июля 2009, 02:03 [#7]:

Пардон. Думал указал выше. MS Access Database.
Но можно и для любой из следующих: SQLite, Accuracer или Absolute DataBase.
Попробовал Accuracer [ http://aidaim.com/products/download.php ], но тоже самое, не могу реализовать регистронезависемый запрос.
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 10 июля 2009, 05:52 [#8]:

Попробуйте в запросе добавить следующее:
collate Cyrillic_General_CI_AS
К сожалению с Access не работал. В MS SQL это проходит.
В приведенном параметре:
CI - регистр не учитывать,
CS - учитывать регистр
Neva26

Neva26 (статус: Посетитель), 10 июля 2009, 15:31 [#9]:

Андрей, а в каком месте запроса вставлять.

Сделал так:

SELECT frName
FROM tRubrics
WHERE cfName LIKE Edit1.Text + "%" COLLATE Cyrillic_General_CI_AS
ORDER BY frName

...но что-то не катит.

Нашел похожее здесь http://forum.shelek.ru/index.php/topic,16956.0.html

А за совет спасибо, думаю направление правильное.
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 10 июля 2009, 19:23 [#10]:

добавляется в конце запроса. Но будет влиять и на сортировку

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:55
Выполнено за 0.02 сек.