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

Откуда:
Сообщений: 37
Добрый день.
В 2008 сервере есть системная view sys.dm_fts_index_keywords - список индесированных слов полнотекстового индекса. Каждое слово внутри хранится как varbinary.
Например слово "abc" преобразуется в 0x006100620063.
Это можно посмотреть(проверить используя ) :
SELECT *
FROM sys.dm_fts_parser(N'abc', 2057, 0, 0) AS f 

Можно ли как-нибудь подобно LIKE найти слова начинающиеся с N'ab%' ? При том что данные хранятся в varbinary.
26 сен 11, 17:31    [11337361]     Ответить | Цитировать Сообщить модератору
 Re: LiKe 'abc%' для varbinary  [new]
LiKe 'abc%'
Guest
select *
from (
select cast('abc' as varbinary(8000)) a
union all
select cast('ab' as varbinary(8000))
union all
select cast('ac' as varbinary(8000))

) a 
where a.a like cast('ab%' as varbinary(8000)) 
26 сен 11, 17:39    [11337411]     Ответить | Цитировать Сообщить модератору
 Re: LiKe 'abc%' для varbinary  [new]
LeadyGaaga
Member

Откуда:
Сообщений: 37
Так не пойдет, индекс по keyword не будет использоваться.
26 сен 11, 17:43    [11337437]     Ответить | Цитировать Сообщить модератору
 Re: LiKe 'abc%' для varbinary  [new]
LiKe 'abc%'
Guest
ну, неравенство используйте
select *
from (
select cast('aa' as varbinary(8000)) a
union all
select cast('abc' as varbinary(8000)) a
union all
select cast('ab' as varbinary(8000)) a
union all
select cast('abcd' as varbinary(8000)) a
union all
select cast('acd' as varbinary(8000)) a
) a 
where a.a >= cast('ab' as varbinary(8000)) and a.a < cast('ac' as varbinary(8000))
26 сен 11, 17:55    [11337491]     Ответить | Цитировать Сообщить модератору
 Re: LiKe 'abc%' для varbinary  [new]
LeadyGaaga
Member

Откуда:
Сообщений: 37
так тоже не пойдет :

CAST(N'z' AS VARBINARY(16))  > CAST(N'a' AS VARBINARY(16))

z>a, но строка "z" не начинается с a.
26 сен 11, 18:02    [11337527]     Ответить | Цитировать Сообщить модератору
 Re: LiKe 'abc%' для varbinary  [new]
LiKe 'abc%'
Guest
LeadyGaaga
так тоже не пойдет :

CAST(N'z' AS VARBINARY(16))  > CAST(N'a' AS VARBINARY(16))

z>a, но строка "z" не начинается с a.

не четаель, да?

зы
в where два неравенства вообщето
26 сен 11, 18:06    [11337544]     Ответить | Цитировать Сообщить модератору
 Re: LiKe 'abc%' для varbinary  [new]
LeadyGaaga
Member

Откуда:
Сообщений: 37
Да не увидел 2 -ое неравенство. Но это же неуниверсальное решение, работает только для английского алфавита.
26 сен 11, 18:25    [11337650]     Ответить | Цитировать Сообщить модератору
 Re: LiKe 'abc%' для varbinary  [new]
LiKe 'abc%'
Guest
LeadyGaaga
Да не увидел 2 -ое неравенство. Но это же неуниверсальное решение, работает только для английского алфавита.

работает для всего, всего-то надо к varbinary прибавить 1 а там хоть 'ab' -> 'ac' хоть 0xff -> 0x100
26 сен 11, 18:49    [11337753]     Ответить | Цитировать Сообщить модератору
 Re: LiKe 'abc%' для varbinary  [new]
LeadyGaaga
Member

Откуда:
Сообщений: 37
Простите за невежество, как это конкретно сделать ?

Есть переменная :
DECLARE @x VARBINARY(128) 

-- таблица с keywords 
DECLARE @tab TABLE (VARBINARY(128) NOT NULL PRIMARY KEY) 

26 сен 11, 22:16    [11338511]     Ответить | Цитировать Сообщить модератору
 Re: LiKe 'abc%' для varbinary  [new]
LiKe 'abc%'
Guest
LeadyGaaga
Простите за невежество, как это конкретно сделать ?

Есть переменная :
DECLARE @x VARBINARY(128) 

-- таблица с keywords 
DECLARE @tab TABLE (VARBINARY(128) NOT NULL PRIMARY KEY) 


не проверял, что-то типа такого

declare @tab table (f varbinary(128) not null primary key) 

declare 
	@x		varbinary(128) = ...
	, @x_max	varbinary(128)

declare @pi int = patindex('%[^' + cast(0xff as varchar) + ']%', reverse(@x))

if @pi > 0 
begin
	set @x_max = cast(left(@x, len(@x) - @pi) as varbinary(128)) + cast(cast(substring(@x, len(@x) - @pi + 1, 1) as tinyint) + 1  as binary(1))
	
	
	select *
	from @tab
	where f >= @x and f < @x_max
end else begin
	select *
	from @tab
	where f >= @x
end
27 сен 11, 13:31    [11341436]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить