2016-08-17 2 views
0

У меня есть таблица со столбцом и значением JobSkill = ".net sap lead". Теперь пользователь вводит значение «abap sap hana». Я хочу включить условие where, которое соответствует ровно 3 или более непрерывным символам, включая пробел. В приведенном выше сценарии обе имеют общую подстроку «sap», поэтому условие должно приводить к истине. Ниже мой запрос. Пожалуйста помоги. Раньше я использую charindex, но это не разрешает цель. Я использую sql server 2008Сравнить все возможные подстроки в двух строках sql server 2008

SELECT Email_Id, JobSkill FROM Jobs 
WHERE CHARINDEX(JobSkill, "abap sap hana") > 0 
+1

код [Полный текст] (https://msdn.microsoft.com/en-us/library/ms142571.aspx) индекс будет работать лучше в вашем случае – cha

+0

Было бы лучше хранить навыки в виде дискретных значений, а не набивать их все в строку, а затем изо всех сил пытаться писать значимые запросы против них, потому что строка не является типом данных *, разработанным * для хранения нескольких значений. –

+0

Я просмотрел статью в полном тексте, но я думаю, что она будет работать как «LIKE», если только она эффективна. Можете ли вы рассказать мне, как это будет работать в моем случае. – Anurag

ответ

1

Вам нужно создать функцию, которая перебирает все позиции символов строки1, за исключением последних 2, и проверить, если String2, как «%» + [(х, х + 1, х +2)] + '%', где x - текущая позиция.

Так укусы ('ABCD ДСА г', 'ерт ДСА'),

он должен проверить

'ert acd' like '%abc%' 
'ert acd' like '%bcd%' 
'ert acd' like '%cd %' 
'ert acd' like '%d a%' 

и так далее ...

Если, как возвращает TRUE, перерыв петля.

+0

Я работаю над созданием этой функции, но я сомневаюсь, будет ли она эффективной методикой, потому что если в строке есть 15 символов, тогда ей нужно сравнить 12 подстрок. Есть ли какой-либо метод для соответствия подстроки в sqlserver2008 – Anurag

+0

Если производительность является проблемой, функции CLR (которые реализуют подобную логику) работают быстрее, но вам нужны навыки программирования на других языках, например C#. У меня есть и другая идея, но не уверен, что это будет быстрее. Вы можете создать предварительно рассчитанную таблицу типа (3,1,3), (4,1,3), (4,2,4), (5,1,3), (5,2,4), (5 , 3,5), (6 .... первый столбец - длина, вторая - начальная позиция, третья - конечная позиция. Затем присоединитесь к этой таблице с помощью ON Lengh () = Table.Length, а затем используйте SUBSTRING + LIKE (ИЛИ CHARINDEX) для сравнения. Замечание - нехорошее место для его описания. – Anton

+0

Если длина фиксирована до 15, тогда эта таблица должна иметь только 12 строк – Anton

0

Попробуйте, как это,

SELECT j.Email_Id 
    ,j.JobSkill 
FROM Jobs j 
INNER JOIN (
    SELECT LTRIM(RTRIM(m.n.value('.[1]', 'varchar(8000)'))) SearchString 
    FROM (
     SELECT CAST('<XMLRoot><RowData>' + REPLACE(@Input, ' ', '</RowData><RowData>') + '</RowData></XMLRoot>' AS XML) AS x 
     ) t 
    CROSS APPLY x.nodes('/XMLRoot/RowData') m(n) 
    ) T ON j.JobSkill LIKE '%' + T.SearchString + '%' 
Смежные вопросы