2012-04-27 6 views
1

Я пытаюсь достичь чего-то, что я не уверен, как это сделать. Я работаю над сайтом, основанным на ASP Classic и SQL 2008, IIS7. На странице поиска у меня есть возможность иметь значение пары для каждого запроса, например default.asp?q=one|two|three&q2=four|five|six.
Что я пытаюсь сделать, так это использовать подстановочный знак, если мои запросы не имеют значения и имеют возможность искать слово в одном столбце одновременно, если мой запрос имеет значение в пару. Вот что я хочу сделать:SQL-запрос с множественным значением

  1. Если запрос значения затем отлично, что в базе данных (которая является довольно простым)
  2. Если запрос пара значения разделенным «|» затем разделите их и найдите все.
  3. Если запрос вообще не имеет значения, используйте подстановочный знак и не используйте для чего-либо.

Чтобы достичь этого, я пробовал пару вещей, но не получил никакого успеха. Вот пример моего кода.

Один -----------

@style nVarchar(150) = '' 
Select * FROM mytable WHERE CONTAINS(style, @style) AND ... 

я могу управлять, чтобы разбить запрос на что-то вроде '"* value1 *" OR "* value2 *"', чтобы получить лучший результат из СОДЕРЖИТ, но если «стиль Это один работает «имеет значение. Если стиль не имеет значения, нет подстановочного знака, поэтому я могу извлечь все данные без фильтрации базы данных.

Два ---------------

@style nVarchar(150) = '' 
Select * FROM mytable WHERE style LIKE '%' + @style + '%' AND ... 

С LIKE статьи я могу использовать подстановочные как '%' в случае, если стиль не имеет никакого значения, но я не могу искать пары значение в той же колонке.
Итак, имейте в виду, что я использую «Хранимую процедуру», так как это довольно сложно, и мне нужно использовать это в двух местах. У меня будет запрос 10-12 для этого поиска.
Любая идея поможет мне добиться этого.

ответ

1

Я понимаю, что ваша проблема связана со значениями, разделенными символом «|». В SQL 2008 вы можете использовать функции Xml, чтобы преобразовать строку в таблицу и запросить его от базовой таблицы:

DECLARE @style VARCHAR(MAX) = 'value1|value2|value3' 
DECLARE @v XML 
SET @v = '<r><n>' + REPLACE(@style, '|', '</n><n>') + '</n></r>' 

SELECT * FROM mytable 
OUTER APPLY 
(
    SELECT c.value('text()[1]', 'varchar(50)') AS v FROM @v.nodes('//n') AS t(c) 
) t 
WHERE style LIKE '%' + t.v + '%' 

Помогает ли это?

+0

Спасибо за ваше время. Это помогает, но вы любезно объясните ВНЕШНЮЮ ПРИМЕНИМОСТЬ? Как то, что произошло в строке «SELECT c.value (« text() [1] »,« varchar (50) ») AS v FROM @ v.nodes ('// n') AS t (c)". Большое спасибо. – Jay

+0

OUTER или CROSS APPLY - это оператор, который позволяет вызывать функцию таблицы для каждой строки, возвращаемой запросом. Проверьте [документацию] (http://msdn.microsoft.com/en-us/library/ms175156 (v = SQL.90) .aspx) в электронной документации по SQL Server, это хорошо объяснено там. Подзапрос SELECT c.value ... используется для извлечения набора строк из Xml, созданного на основе значения «value1 | value2 | value3». Функция nodes() возвращает узлы, указанные XPath "// n" и c.value ('text() [1]' ...) извлекает текст. Индекс [1] требуется методом value() для указания первого текстового узла. –

+0

спасибо для объяснения. Я продолжу читать эту документацию. Если у меня есть запрос на пару, мне нужно дублировать это время на мои запросы? – Jay

Смежные вопросы