2013-10-28 2 views
4

в сервере SqlSQL для проверки строки содержит с тем, где пункт

У меня есть следующая строка

DECLARE @str nvarchar(max); 
set @str = "Hello how are you doing today,Its Monday and 5 waiting days"; 

DECLARE @srch nvarchar(max); 
set @srch = " how,doing,monday,waiting"; 

Теперь я хочу, чтобы проверить, содержит ли Обл любой строки (через запятую строка) из SRCH

Я хочу это в только SQL сервере

есть possibilites написать некоторый запрос с пунктом

как

select from @str where _____ in (select * from CommaSplit(@srch) 

где функция CommaSplit rerturns строки @srch разделителями значения отдел ют

Я не хочу использовать курсор или какой-либо концепции цикла в качестве значения @srch может быть очень длинным

Благодаря

+0

проверить это: http://stackoverflow.com/questions/19584865/declare-multiple-value-variable-in-sql/19585026?noredirect = 1 # comment29068637_19585026 –

+0

Вам лучше использовать концепцию цикла, если @srch длиннее, чем пытаться использовать. Используя цикл, вы можете создать функцию, которая разбивает вашу строку на результат таблицы и затем соединяется с этим результатом. Это дает вам большую гибкость и, скорее всего, производительность. –

ответ

2

вы можете использовать ту же самую функцию, чтобы получить первую строку в строках

select string from CommaSplit(@srch,'') where string in (select * from CommaSplit(@srch) 
+0

Это будет работать, только если строки в переменной @srch также разделяются комой. В противном случае результат будет неправильным ... – Sandr

+0

Спасибо, что это сработало, поскольку у меня есть контроль над строкой srch, но я думаю, вы ошибаетесь, что вначале появление @srch должно быть str –

0

Вы можете использовать следующий общий запрос табличных выражений, чтобы разделить вашу строку на части. cte будет содержать одну запись за фразу в @srch. В моем примере ниже я показываю, где находится @str каждая поисковая фраза. Он возвращает 0, если он не может найти поисковую фразу.

Примечание 1: он не отображает местоположение дважды, если ваша поисковая фраза дублируется - для этого вам понадобится другой CTE.

Примечание 2: Я должен добавить запятую в конце @srch, чтобы моя работа CTE. Вы можете сделать это внутри CTE, если вы предпочитаете не менять строку поиска.

DECLARE @str nvarchar(max); 
set @str = 'Hello how are you doing today,Its Monday and 5 waiting days'; 

DECLARE @srch nvarchar(max); 
set @srch = 'how,doing,monday,waiting'; 

set @srch = @srch + ',' 

-- first split the text into 1 character per row 
;with cte 
as 
(
    select substring(@srch, 1, CHARINDEX(',', @srch, 1) - 1) as Phrase, CHARINDEX(',', @srch, 1) as Idx 

    union all 

    select substring(@srch, cte.Idx + 1, CHARINDEX(',', @srch, cte.Idx + 1) - cte.Idx - 1) as Phrase, CHARINDEX(',', @srch, cte.Idx + 1) as Idx 
    from cte 
    where cte.Idx < CHARINDEX(',', @srch, cte.Idx + 1) 
) 

select charindex(cte.Phrase, @str, 1) from cte 
0

Я не думаю, что положение IN является то, что вам нужно. Вместо этого вы можете использовать LIKE конструкцию следующим образом:

if (select count(*) from CommaSplit(@srch) where @str like '%' + val + '%') > 0 
     select 'true' 
else 
     select 'false' 

В этом случае вы получите 'true', когда по крайней мере один результат CommaSplit функция существует в @str текста. Но в этом случае вы также получите значение 'true', когда результат функции CommaSplit является частью слова в строке @str.

Если вам нужно более точное решение, это может быть достигнуто следующим образом: вам нужно разделить @str на слова (также предварительно заменить знаки препинания пробелами). И после этого пересечение CommaSplit (@srch) и SpaceSplit(@str) будет ответом на вопрос. Среди них вы также сможете проверить, какие слова совпадают между двумя строками.

Накладные расходы этого метода заключаются в создании функции SpaceSplit, которая является копией CommaSplit, но с другим разделителем. Или функция CommaSplit может быть изменена для приема разделителя в качестве параметра.

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