2013-04-01 4 views
2

Я использую SQL Server 2012.TSQL - Pattern Matching с Like

Я знаю, что я могу использовать, как в запросе, чтобы соответствовать шаблону в базе данных:

т.е.

SELECT * from PEOPLE where name LIKE 'STEVE%' 

бы вернуть всех людей, называемых steve.

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

Например у меня есть база данных, которая имеет эти модели в

Row  Input     Response 
    1  '% is a sort of %' 'I know that.' 

Как бы я быть в состоянии соответствовать пользовательскому вводу «VW является своим родом автомобиль» к данным в строке 1?

Что касается фона, я недавно изучал чатботы, и они регулярно выполняют подобный поиск по файлам XML.

Для получения бонусных баллов, как сохранить значения% в переменной?

ответ

4

Обычно вы WHERE column LIKE @variable, но почему вы не можете сделать это наоборот?

DECLARE @x TABLE([Row] INT, Input VARCHAR(32), Response VARCHAR(32)); 

INSERT @x([Row],Input,Response) SELECT 1, '% is a sort of %', 'I know that.'; 

DECLARE @variable VARCHAR(32) = 'VW is a sort of Car'; 

SELECT [Row], Input, Response 
    FROM @x 
    WHERE @variable LIKE [Input]; 
+0

Ничего себе, я понятия не имел, что вы можете перевернуть его таким образом. Это ... очень мощный! Благодарю Тебя. Это должно хорошо масштабироваться. – PapaSmurf

0

вы можете сделать очень похожий поиск

where input like '%is a sort of%' 

или вы можете посмотреть РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ regex для более сложного поиска по шаблону

1

Регулярные выражения даст вам доступ к частям рисунка, что оно соответствует , Я предполагаю, что это то, что вы имеете в виду под «хранить% в переменной»:

http://msdn.microsoft.com/en-us/magazine/cc163473.aspx

+0

RegEx похоже на экстремальный избыток для примера в вопросе. –

+0

Спасибо AaronLS, я обязательно буду больше смотреть в Regex в будущем, поскольку похоже, что есть какая-то функциональность, которая может расширить то, что я хочу сделать. Однако мне пришлось бы это изучить с нуля, так что теперь я думаю, что я пойду с более простым решением. Большое спасибо за ваш ответ. – PapaSmurf

+0

@Aaron Это единственное решение, которое я знаю о том, что отвечает требованию афера, чтобы он мог извлечь строку, которая подбирала подстановочный знак. У меня не было достаточно подробностей, чтобы сказать, что это слишком много, или просто потому, что он соответствовал их требованиям. Я продал им молоток. Я не спрашивал их, что они собираются делать с ним :) – AaronLS

3

Вы можете использовать этот вид таблицы, которая содержит список шаблонов и есть эти модели «применяются» в запросе, как это:

SELECT PT.pattern AS matching_pattern, 
     ST.searched_field AS matched_value 
FROM Pattern_Table AS PT 
    INNER JOIN Searched_Table AS ST ON ST.searched_field LIKE PT.pattern 

Это будет что-то вроде:

matching_pattern matched_value 
% is a sort of % VW is a sort of Car 

Have a look at it on SQLFiddle (даже если это MySQL он все еще работает)

Надеется, что это помогает

+1

Спасибо MaxiWheat, который дает мне именно то, что я хочу в первом случае. Думаю, мне нужно было передать строку в функцию и использовать подстроку, чтобы получить значения «VW» и «car»? – PapaSmurf

+0

Я пошел с решением, которое производит более простое решение и план запросов. но спасибо, что нашли время, чтобы ответить, а также спасибо, что ознакомили меня с скриптом SQL. Это определенно стоит upvote, как только я могу это сделать :) – PapaSmurf