Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ADO, SQL, LIKE 
:(
    Опции темы
WolfON
Дата 12.4.2005, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 604
Регистрация: 19.7.2004

Репутация: нет
Всего: 8



Кароче, мне надо в таблице найти все записи, которые включают какое-то слово[скорее его часть], но НЕ ЗАВИСИМО ОТ ЕГО РЕГИСТРА
Я делаю так:
Код

SELECT * FROM Table WHERE Pole LIKE "%тут то, что надо искать%"

Но, такая комадна зависит от регистра, в DRKB предлагают использовать CONTAINING, но на ADO он неработает
smile smile smile
PM MAIL ICQ   Вверх
DimW
Дата 12.4.2005, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 5
Всего: 44



Я такую проблему решал следеющим образом:

допустим нужно найти слово st_Osn:='Программист', а юзер ввел st_find:='рАмм'.

в цикле по таблице ( for i:=... ):

if (ord(st_osn[i])= ord(st_find[n])) or
(ord(st_osn[i])= ord(st_find[n])-32) or
(ord(st_osn[i])= ord(st_find[n])+32) then
---------------------------------------------------------

Короче здесь праверяются не символы, а их коды.
ord('А')-ord('a')=32 (вот что я имею ввиду).

но эта схема будет работать наверника, только с буквенными символами.

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

PM MAIL ICQ   Вверх
bursa
Дата 12.4.2005, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 25.2.2005
Где: Липецк

Репутация: 1
Всего: 1



Цитата(DimW @ 12.4.2005, 14:53)
ord('А')-ord('a')=32 (вот что я имею ввиду).

Ух ты!
Зачем так сложно.

Код, правда, Oracle
Код

SELECT * FROM Table WHERE Upper(Pole) LIKE UPPER("%тут то, что надо искать%")


Перевести все в верхний регистр - и дело с концом! smile



PM MAIL   Вверх
WolfON
Дата 12.4.2005, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 604
Регистрация: 19.7.2004

Репутация: нет
Всего: 8



Благодарю.
PM MAIL ICQ   Вверх
WolfON
Дата 12.4.2005, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 604
Регистрация: 19.7.2004

Репутация: нет
Всего: 8



Поторопился smile
Так вот, на Access'овской базе, к которой я подключился это не работает, говорит незнает что-такое Upper smile((
Цитата
if (ord(st_osn[i])= ord(st_find[n])) or
(ord(st_osn[i])= ord(st_find[n])-32) or
(ord(st_osn[i])= ord(st_find[n])+32) then

Учитывая объемы базы - искать будет вечность
PM MAIL ICQ   Вверх
DimW
Дата 12.4.2005, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 5
Всего: 44



Цитата
Учитывая объемы базы - искать будет вечность


неспорю, [censored34! Пожалуйста, соблюдайте элементарные правила приличия при общении на форуме] пример...

Цитата
Ух ты!
Зачем так сложно.


а вот зачем:
Цитата
Так вот, на Access'овской базе, к которой я подключился это не работает, говорит незнает что-такое Upper


bursa не в обиду сказано. smile

вот задачка.... что то надо делать!!!

А база с данными уже есть или в планах только? если в планах то можно разрешить ввод только верхнего регистра на уровни приложения...


PM MAIL ICQ   Вверх
bursa
Дата 12.4.2005, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 25.2.2005
Где: Липецк

Репутация: 1
Всего: 1



Цитата(DimW @ 12.4.2005, 15:43)
вот задачка.... что то надо делать!!!

Неужто в аксессе нет функции перевода в верхний/нижний регистр?
Тогда я пас. Примите соболезнования. И мои извинения.

PM MAIL   Вверх
WolfON
Дата 12.4.2005, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 604
Регистрация: 19.7.2004

Репутация: нет
Всего: 8



Цитата
если в планах то можно разрешить ввод только верхнего регистра на уровни приложения...

База уже есть, а перевести вводимую строку в нижний регистр можно ф-ией LowerCase.
Только вот проблема в том, что в базе слово/часть солва может быть записанно с разными регистрами [орфографию соблюдаю, млин].


bursa Кажись в аксессе реализован SQL/92
PM MAIL ICQ   Вверх
DDX
Дата 12.4.2005, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 31.1.2005
Где: Москва

Репутация: 5
Всего: 5



в JetSQL Like и так ищет независимо от регистра
я пробовал: если писать like "*пример*" или даже так like "*прИмЕр*" то находятся записи всех регистров на ура

Это сообщение отредактировал(а) DDX - 12.4.2005, 16:11
--------------------
Учиться, учитьcя и ещё раз учиться  
PM MAIL WWW   Вверх
WolfON
Дата 12.4.2005, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 604
Регистрация: 19.7.2004

Репутация: нет
Всего: 8



DDX
Действительно smile
Только, вот вместо * надо %
PM MAIL ICQ   Вверх
DDX
Дата 12.4.2005, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 31.1.2005
Где: Москва

Репутация: 5
Всего: 5



WolfON
ты не поверишь, но у меня ищется только с *, хотя в справке написано, что они равносильны

Важное замечание: такие подстановочные знаки ANSI SQL, как (%) и (_), доступны только при использовании ядра Microsoft® Jet версии 4.X и программы Microsoft OLE DB Provider для Jet. При работе с приложениями Microsoft Access или DAO эти подстановочные знаки воспринимаются как строковые константы. - JETSQL40.CHM

Это сообщение отредактировал(а) DDX - 12.4.2005, 18:07
--------------------
Учиться, учитьcя и ещё раз учиться  
PM MAIL WWW   Вверх
Bes
Дата 13.4.2005, 06:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: 2
Всего: 7



2WolfON: не парься, для акцесса ф-ии Upper = Ucase, а Lower = LCase, а остальное по той же схеме.
PM MAIL   Вверх
DimW
Дата 13.4.2005, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 5
Всего: 44



DDX блин молоток!!! не поддался на правокацию WolfON...
Я тоже "хорош", праверил в оракле запрос с Like и убедившись что он не работает так как хотелось бы, начал искать тупые обходы... А оказалось, что все поддерживается драйвером Jet...
Мне 2 сообщения до сотни не хватает, как только догоню, пополню тебе репутацию!!!! smile
PM MAIL ICQ   Вверх
DDX
Дата 13.4.2005, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 31.1.2005
Где: Москва

Репутация: 5
Всего: 5



DimW

--Resize_Images_Alt_Text--

Это сообщение отредактировал(а) DDX - 13.4.2005, 13:59
--------------------
Учиться, учитьcя и ещё раз учиться  
PM MAIL WWW   Вверх
WolfON
Дата 13.4.2005, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 604
Регистрация: 19.7.2004

Репутация: нет
Всего: 8



DimW
Цитата
не поддался на правокацию WolfON...

А я че? я ниче smile так в drkb написанно
Цитата
LIKE 

 

 
Предикат LIKE используется только с символьными данными. Он проверяет, соответствует ли данное символьное значение строке с указанной маской. В качестве маски используются все разрешенные символы (с учетом верхнего и нижнего регистров), а также специальные символы: 

% - замещает любое количество символов (в том числе и 0), 

_ - замещает только один символ. 

 
Разрешено также использовать конструкцию NOT LIKE.

SELECT first_name, last_name 

FROM employee 

WHERE last_name LIKE "F%"      получить список сотрудников, 

      фамилии которых начинаются      с буквы "F" 

 
 

 
FIRST_NAME      LAST_NAME             

=============== ==================== 

Phil            Forest               

Pete            Fisher               

Roberto        Ferrari 

 
 

 
SELECT first_name, last_name 

FROM employee 

WHERE first_name LIKE "%er"      получить список сотрудников, 

      имена которых      заканчиваются буквами "er"       

 
FIRST_NAME      LAST_NAME             

=============== ==================== 

Roger          De Souza             

Roger          Reeves               

Walter          Steadman 

 
 

А такой запрос позволяет решить проблему произношения (и написания) имени: 

 

 
SELECT first_name, last_name 

FROM employee 

WHERE first_name LIKE "Jacq_es" 

      найти сотрудника(ов), 

      в имени которого 

      неизвестно произношение 

      буквы перед окончанием "es" 

 
 

 
FIRST_NAME      LAST_NAME             

=============== ==================== 

Jacques        Glon 

 
 

Что делать, если требуется найти строку, которая содержит указанные выше специальные символы ("%", "_") в качестве информационных символов? Есть выход! Для этого с помощью ключевого слова ESCAPE нужно определить так называемый escape-символ, который, будучи поставленным перед символом "%" или "_", укажет, что этот символ является информационным. Escape-символ не может быть символом "\" (обратная косая черта) и, вообще говоря, должен представлять собой символ, никогда не появляющийся в упоминаемом столбце как информационный символ. Часто для этих целей используются символы "@" и "~". 

 

 
SELECT first_name, last_name 

FROM employee 

WHERE first_name LIKE "%@_%" ESCAPE "@" 

      получить список сотрудников, 

      в имени которых содержится "_" 

      (знак подчеркивания) 


PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0673 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.