Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подбор условия выборки в зависимости от параметра, Проблема с полным вычислением условий 
:(
    Опции темы
mihryak
Дата 6.4.2012, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Привет!

Пытаюсь написать табличную фукцию для полнотекстового поиска, выбирающую предикат FREETEXT или CONTAINS в зависимости от переданного параметра.

Код

    declare    @searchKey    nvarchar(200)
    declare    @exactMatch    bit
    
    set @searchKey = 'help desk';
    set @exactMatch = 0;

    --set @searchKey = '"help" AND "desk"';
    --set @exactMatch = 1;

    with CategoryCTE as
    (
        select
            RootCategory.Id
        from
            Category RootCategory            
        where
            (@exactMatch = 0 and freetext(RootCategory.Title, @searchKey)) or
            (@exactMatch = 1 and contains(RootCategory.Title, @searchKey))
        
        union all
        
        select
            ChildCategory.Id
        from
            Category ChildCategory
                inner join
                    CategoryCTE ccte on ChildCategory.ParentId = ccte.Id    
    )
    
    select * from CategoryCTE


Судя по ошибке про неправильный синтаксис запроса при выполении мой функции (CONTAINS не поддерживает несколько слов; их надо через OR или AND перечислять), оба условия выполняются полностью, что недопустимо.

Гугл подсказал, что нельзя полагаться на порядок и полноту вычисления предикатов.

Через CASE переписать условие тоже не вышло, так что пока что единственным получившимся у меня вариантом является создание ещё одной такой же функции (в них, кажется, нельзя писать IF), только с CONTAINS вместо FREETEXT. А в хранимке, которая их вызывает, уже проврять параметр и решать, какую вызвать. Это отвратительно и грустно.

Нет ли идей, что можно тут сделать, чтобы избежать массированной копипасты? Это только кусок реального запроса, который в жизни куда больше, что ещё больше вызывает нежелание копипастить. В скуле мало что смыслю, так что рад буду любому совету.



Это сообщение отредактировал(а) mihryak - 6.4.2012, 15:41
PM MAIL ICQ   Вверх
Zloxa
Дата 9.4.2012, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


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

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



Цитата(mihryak @  6.4.2012,  16:28 Найти цитируемый пост)
Это отвратительно и грустно.

Не грустите. Это нормально. Для разных предикатов доступа таки много лучше использовать разные запросы. Повторное использование, это совсем не про SQL. Здесь это скорее зло. Ибо вью на вью на вью на вью = смерть.

Если я правильно понял суть проблемы, вы можете:
1) Использовать временную таблицу, в которую будете сохранять результаты отбора по freeText или по contains двумя запросами, в завиимости от параметра, и в своем мегаэпическом запросе, в качестве источника, использовать эту временную таблицу

2) Вместо оператора or использовать union all. Правда не уверен я в том, как это задружит с рекурсивным cte, но, полагаю, правильная расстановка скобок позволит им замириться

3) Вас никто не заставляет использовать один и тот же паттерн для free text и contains. Вы можете использовать разные, которые будете вычислять в зависимости от параметра (читобы синтаксис не ругался)

Это сообщение отредактировал(а) Zloxa - 9.4.2012, 09:26


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
mihryak
Дата 9.4.2012, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Zloxa, спасибо!
Мне и правда надо научиться перестраиваться с императивных языков на скуль
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

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

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


 




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


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

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