Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > ADO, SQL, LIKE


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

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

Но, такая комадна зависит от регистра, в DRKB предлагают использовать CONTAINING, но на ADO он неработает
smile smile smile

Автор: DimW 12.4.2005, 14:53
Я такую проблему решал следеющим образом:

допустим нужно найти слово 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

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

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

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

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


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



Автор: WolfON 12.4.2005, 15:13
Благодарю.

Автор: WolfON 12.4.2005, 15:23
Поторопился 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

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

Автор: DimW 12.4.2005, 15:43
Цитата
Учитывая объемы базы - искать будет вечность


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

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


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


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

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

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


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

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

Автор: WolfON 12.4.2005, 16:06
Цитата
если в планах то можно разрешить ввод только верхнего регистра на уровни приложения...

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


bursa Кажись в аксессе реализован SQL/92

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

Автор: WolfON 12.4.2005, 16:13
DDX
Действительно smile
Только, вот вместо * надо %

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

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

Автор: Bes 13.4.2005, 06:01
2WolfON: не парься, для акцесса ф-ии Upper = Ucase, а Lower = LCase, а остальное по той же схеме.

Автор: DimW 13.4.2005, 07:32
DDX блин молоток!!! не поддался на правокацию WolfON...
Я тоже "хорош", праверил в оракле запрос с Like и убедившись что он не работает так как хотелось бы, начал искать тупые обходы... А оказалось, что все поддерживается драйвером Jet...
Мне 2 сообщения до сотни не хватает, как только догоню, пополню тебе репутацию!!!! smile

Автор: DDX 13.4.2005, 13:58
DimW

http://www.forum.mifp.ru/html/emoticons/drink.gif

Автор: WolfON 13.4.2005, 16:05
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 "@" 

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

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

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


Автор: Medved 15.4.2005, 00:44
WHERE UpperCase(first_name) LIKE UpperCase('%Так решается проблемма с регистром%')

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)