Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как написать LIKE ?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Как написать LIKE, если я хочу найти все слова, с произвольным началом и в конце СЛОВА должно быть me. Причем, сюда должны входить и слова, стоящие в конце строки. Например, ищу слова типа Name, Programme и т.д.
Было бы хорошо обойтись без OR.
Вот так не хотелось бы, не очень эффективно:

select * from table1
where name like '%me' or
name like '%me[!@#$%^&*()_-=+{} ,./?''\|/<>;:]%'

Можно ли одним сравнением добиться результата?
1 мар 04, 19:36    [558211]     Ответить | Цитировать Сообщить модератору
 Re: Как написать LIKE ?  [new]
Glory
Member

Откуда:
Сообщений: 104760
select * from table1 

where name like '%[^ ]me'
1 мар 04, 19:38    [558216]     Ответить | Цитировать Сообщить модератору
 Re: Как написать LIKE ?  [new]
Glory
Member

Откуда:
Сообщений: 104760
select * from table1 

where name like '%[^ ]me%'
1 мар 04, 19:53    [558228]     Ответить | Цитировать Сообщить модератору
 Re: Как написать LIKE ?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
не совсем так:
select * from table1
where name like '%[^ ]me%'

сюда попадет, например, слово 'men', а это неверно.
Нужно Name, Programme ... но внутри строки, и в конце. Если бы был символ для указания конца строки, как в грепе, все бы решалось :-)
1 мар 04, 19:57    [558232]     Ответить | Цитировать Сообщить модератору
 Re: Как написать LIKE ?  [new]
Glory
Member

Откуда:
Сообщений: 104760
declare @t table(x varchar(100))

insert @t values(' name')
insert @t values(' programme 1')
insert @t values(' me')
insert @t values('xmen movie')

select * from @t
where x+' ' like '%[^ ]me[ ]%'


Но так индекс использоваться не будет. Лучше всего парсить исходное поле на слова, из которых составлять словарь.
1 мар 04, 20:11    [558240]     Ответить | Цитировать Сообщить модератору
 Re: Как написать LIKE ?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Это точно, индекс нельзя использовать, но и так все сложнее, ведь разделителями могут быть не только пробелы,
[!@#$%^&*()_-=+{} ,./?''\|/<>;:]

Кроме того, строка полноиндексирована, но из-за того, что юзер хочет искать задавая слева что-то типа %, FT нельзя использовать. Недоделанный FTS у майкрософта, да они и сами это признают...
1 мар 04, 20:23    [558245]     Ответить | Цитировать Сообщить модератору
 Re: Как написать LIKE ?  [new]
Puzik
Member

Откуда:
Сообщений: 20
а обязательно LIKE ?
не люблю им пользоваться
SELECT field1
from T1
where instr(field1,'me',3)>0
2 мар 04, 00:20    [558356]     Ответить | Цитировать Сообщить модератору
 Re: Как написать LIKE ?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Это точно, индекс нельзя использовать,
Вообще-то я имел ввиду не FTS индекс, а обычный - по столбцу name.
При конструкции name LIKE '...' индекс может использоваться, при - name+' ' LIKE '...' точно не будет использоваться индекс

Кроме того, строка полноиндексирована, но из-за того, что юзер хочет искать задавая слева что-то типа %, FT нельзя использовать. Недоделанный FTS у майкрософта, да они и сами это признают...
Ну а если самому немного поработать? Поформатировать исходные данные(в момент их занесения/обновления), приведя скажем все разделители к единому ?
А для FTS поиска наоборт можно думаю приспособить вычисляемое поле на основе стандартной функции reverse().

Но лучший на мой взгляд метод - это парсить исходный текст на слова самостоятельно.
2 мар 04, 10:23    [558580]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить