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

Откуда: Київ
Сообщений: 10428
select t1.id from dbo.t1
where
id > @id and
(len(@str)=0 OR
(len(@str)>0 AND NOT
(CONTAINS(value1, @str)
OR CONTAINS(value2, @str)
)))

Суть такая: value1 и value2 - участвуют в полнотекстовом индексе.
И хотелось этим селектом выбрать записи у которых ид больше указанного и если задана строка поиска - искать ее в обеих полнотектстовых строках, а если нет - не искать вообще.
Так вот такой селект дает ошибку, почему?????

Server: Msg 7603, Level 15, State 1, Line 82
Syntax error in search condition, or empty or null search condition ''.
8 сен 03, 20:49    [330621]     Ответить | Цитировать Сообщить модератору
 Re: Хэлп: простой казалось бы селект  [new]
Lexis
Member

Откуда: Moscow
Сообщений: 1737
видимо @str null или empty

проверь сначала первым запросом наличие данных, а потом уже запускай полнотекстовый поиск
8 сен 03, 23:00    [330684]     Ответить | Цитировать Сообщить модератору
 Re: Хэлп: простой казалось бы селект  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
@str может быть пустой или не пустой, в том то и вопрос. Но ведь стоит же проверка в расчете на все случаи

len(@str)>0 AND NOT
(CONTAINS(value1, @str)
OR CONTAINS(value2, @str)
9 сен 03, 10:52    [331037]     Ответить | Цитировать Сообщить модератору
 Re: Хэлп: простой казалось бы селект  [new]
Lexis
Member

Откуда: Moscow
Сообщений: 1737
проверка должна идти до...а не одновременно
9 сен 03, 11:43    [331183]     Ответить | Цитировать Сообщить модератору
 Re: Хэлп: простой казалось бы селект  [new]
Гнездин Петр
Member

Откуда: Москва
Сообщений: 359
Это какой-нибудь компилятор типа C++ может гарантировать, что выражения вычисляются последовательно. А в данном случае сначала производятся все вычисления, а потом проверяется условие. Кстати, не зря ли у вас там стоит AND NOT?
9 сен 03, 11:58    [331225]     Ответить | Цитировать Сообщить модератору
 Re: Хэлп: простой казалось бы селект  [new]
Гарик
Guest
А если так...

select t1.id from dbo.t1 

where
id > @id and
(len([b]isNull(@str,'')[/b])=0 OR
(len(@str)>0 AND NOT
(CONTAINS(value1, @str)
OR CONTAINS(value2, @str)
)))
9 сен 03, 12:03    [331248]     Ответить | Цитировать Сообщить модератору
 Re: Хэлп: простой казалось бы селект  [new]
Гарик
Guest
блин....

select t1.id from dbo.t1
where
id > @id and
(len(isNull(@str,''))=0 OR
(len(@str)>0 AND NOT
(CONTAINS(value1, @str)
OR CONTAINS(value2, @str)
)))
9 сен 03, 12:08    [331262]     Ответить | Цитировать Сообщить модератору
 Re: Хэлп: простой казалось бы селект  [new]
Гнездин Петр
Member

Откуда: Москва
Сообщений: 359
Мне кажется, что здесь варианта всего два. Либо динамический запрос со всеми его минусами и плюсами, либо что-то типа такого:

declare @str2 varchar(8000)
set @str2 = ltrim(rtrim(isnull(@str, '')))
if len(@str2) = 0 set @str2 = 'абырвалг'

select t1.id from dbo.t1
where
id > @id and
(len(isnull(@str, ''))=0 OR
(len(@str)>0 AND -- или AND NOT, если искать все кроме @str

(CONTAINS(value1, @str2)
OR CONTAINS(value2, @str2)
)))

В этом случае CONTAINS будет вычисляться всегда.
9 сен 03, 12:32    [331333]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить