Как я могу смешать СОДЕРЖАНИЕ с другими условиями в SQL - PullRequest
0 голосов
/ 29 ноября 2011

Не могли бы вы сообщить мне, как я могу объединить CONTAINS с другими условиями в SQL?Я хочу, чтобы на моем веб-сайте было поле поиска, и я хочу сузить результат с помощью других параметров.Например, если кто-то ищет рубашку, на странице результатов будет показано, что все данные содержат слово «рубашка», используя CONTAINS в моем коде SQL.После этого у меня есть несколько вариантов, таких как цвет, размер и т. Д., Что должно сузить поиск рубашки.Вот когда первая поза:

SELECT * FROM tbl WHERE CONTAINS(*, 'shirt') AND color LIKE '%' AND size LIKE '%'

Пока все в порядке и работает.Но что, если наш пользователь не использует поле поиска, и они приходят, например, к цвету?Как должен выглядеть мой запрос?

SELECT * FROM tbl WHERE contains(*, '???') AND color LIKE 'Red' AND size LIKE '%'

В основном в состоянии LIKE, когда вы используете '%', это означает все, но честность, с которой я не знаю, как обращаться с содержимым ???
Это то, что я думаю.Пожалуйста, дайте мне знать, если это должно быть обработано любым другим способом.Кстати, я использую SQL 2008 и классический ASP.

Заранее спасибо за ваше мнение.

Ответы [ 2 ]

3 голосов
/ 29 ноября 2011

Обычно вам нужно изменить форму запроса, чтобы она содержала только соответствующие предикаты. Таким образом, два запроса выше будут записаны как

SELECT * FROM tbl WHERE CONTAINS(*, 'shirt')

SELECT * FROM tbl WHERE color like 'Red'

Если действительно необходимо использовать статическую форму запроса, вы можете рассмотреть более сложную версию, которая учитывает «пустое условие».

SELECT * FROM tbl 
    WHERE ('???' = 'shirt' OR CONTAINS(*, 'shirt')) 
    AND ('%' = '%' OR color like '%') 
    AND ('%' = '%' OR size like '%')

Обратите внимание, это выглядит странно выше, потому что этот запрос не параметризован. Итак, у вас есть запрос, который заканчивается выполнением с константами, равными друг другу. Еще лучше было бы использовать параметризацию, поскольку она помогает предотвратить атаки с использованием SQL-инъекций и может быть более производительной.

SELECT * FROM tbl 
    WHERE ('???' = @containsParam OR CONTAINS(*, @containsParam)) 
    AND ('%' = @colorParam OR color like @colorParam) 
    AND ('%' = @sizeParam OR size like @sizeParam)
0 голосов
/ 29 ноября 2011

Настройте свой веб-сайт таким образом, чтобы он динамически генерировал разные запросы, когда разные текстовые поля оставлены пустыми, например:

SELECT * 
FROM tbl 
WHERE CONTAINS(*, 'shirt')
                           --- leaving these out
                           --- AND color LIKE '%' AND size LIKE '%' 

или

SELECT * 
FROM tbl 
WHERE color LIKE 'Red' 
                           --- leaving these out
                           --- AND CONTAINS(*, '???') 
                           --- AND size LIKE '%' 

или, и только если выбраны все поля:

SELECT * 
FROM tbl 
WHERE CONTAINS(*, 'shirt')
  AND color LIKE 'Red' 
  AND size LIKE 'Large' 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...