2012-04-30 2 views
3

Мне нужно совместить на частичной строке, но не могу включить полнотекстовое индексирование, поэтому не может использовать contains. Я посмотрел на функцию Левенштейна для определения расстояния между двумя строками, но я не ищу нечеткого соответствия, но каждый символ в столбце существует в строке.Sql Server содержит

I.e. Если передаваемая строка является чем-то вроде AB_SYS_20120430.TXT, я хочу сопоставлять любые столбцы, содержащие AB_SYS. Подобный предикат не доставляет меня туда. Мне действительно нужен эквивалент функции .NET, но, как упоминалось, включение полнотекстового индексирования не является возможностью включения. Думал, что увижу, есть ли еще какая-то другая работа.

+0

Почему 'LIKE' не работает для вас? Я думаю, это то, что вы хотите, но вам, вероятно, придется упорядочить свои данные по-разному. –

ответ

5

Вы ищете функцию LIKE?
http://www.w3schools.com/sql/sql_like.asp

... WHERE MyColumn LIKE '%AB_SYS%' 

Это не может быть оптимальным, но кажется, что это отвечает на ваш вопрос ... Если вы можете найти только с левой или правой стороны, что может еще больше оптимизировать.

Это функционально похож на String.Contains
http://msdn.microsoft.com/en-us/library/dy85x1sa.aspx

EDIT: Как вы будете анализировать входной текст в «соответствующей» подстроки?

EDIT: Для поиска же LIKE состояния, но наоборот, от вашего частичного столбца полного буквальным, просто добавить подстановочные символы:

... WHERE 'AB_SYS_20120430.TXT' LIKE '%' + MyColumn + '%' 

EDIT: Вы предположили, что вы можете» t заставить его работать. Если добавить схему сделать ваш вопрос, то я могу Вам помочь, но подумайте:

У вас есть таблица с именем MyTable
В этой таблице есть столбец с названием MyColumn
Некоторые строки в этой таблице есть данные 'AB_SYS' в MyColumn

Учитывая параметр 'AB_SYS_20120430.TXT' вы хотите вернуть все соответствующие строки

CREATE PROCEDURE MyTestProcedure 
    @pFullNameString nvarchar(4000) = '' -- parameter passed in, like AB_SYS_20120430.TXT 
AS 
BEGIN 
    SELECT 
     * 
    FROM 
     MyTable 
    WHERE 
     @pFullNameString LIKE '%' + MyTable.[MyColumn] + '%' 
END 
GO 
+0

Вот в чем проблема: я не могу разобрать его в соответствующую строку. Это случай использования с избытком, когда мы хотим посмотреть в любом месте строки. В противном случае я бы использовал оператор in или equals, когда у меня была соответствующая строка. Я не могу использовать их, так как я не могу включить полное индексирование в БД. Я хотел бы иметь возможность обрабатывать это в выражении SQL (значение, переданное в sproc), а не возвращать его в .NET и делать некоторое сравнение сглаживания, а затем передавать соответствующее значение. –

+0

@nonuabiz, как вы знаете, какая часть нужная строка? Как вы хотите первые 6 символов? Вы хотите, чтобы жало на второй знак подчеркивания? Если ваш вопрос синтаксический анализ, вы должны определить параметры ... в противном случае, почему бы не содержать строку, содержащую «AB» или даже «A»? – Matthew

+0

Я хочу, чтобы вся строка соответствовала столбцу, но где AB_SYS существует где угодно в строке.Таким образом, он не будет совпадать с A или AB, но только точное совпадение буквального строкового значения AB_SYS в любом месте переданной строки (I.e. AB_SYS_20120430.TXT по сравнению с 20120430_AB_SYS.TXT оба будут возвращаться, но 20120430_AB_SY.TXT не будет, например). Не так сильно отличается от того, что он говорит, что «AB_SYS%» отличается только тем, что ему нужно смотреть влево или вправо от строки. Я просто хочу его в любой строке. Такая же предпосылка, как перенос ее на .NET и использование, содержит строку. То есть Взято из MSDN: –

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