Функция CONTAINS sql не соответствует символам подчеркивания

У меня есть таблица TableName, например Id, Name:

1 | something
2 | _something
3 | something like that
4 | some_thing
5 | ...

Я хочу получить все строки из этой таблицы, в которых имя содержит «некоторые». У меня 2 способа:

SELECT * FROM TableName WHERE Name like '%some%'

Результатом является таблица:

1 | something
2 | _something
3 | something like that
4 | some_thing

Но если я использую функцию CONTAINS

SELECT * FROM TableName WHERE CONTAINS(Name,'"*some*"')

Я получаю только

1 | something
3 | something like that

Что мне делать, чтобы функция CONTAINS работала правильно?


person Kate    schedule 13.01.2010    source источник


Ответы (3)


http://doc.ddart.net/mssql/sql70/ca-co_15.htm

Если вы прочтете эту статью, вы увидите, что * означает префикс, это означает, что слово должно начинаться с этого, но как означает, что слово содержит ключевую фразу.

С уважением, Иордан

person IordanTanev    schedule 13.01.2010
comment
Я знаю, что означает префикс *, я использую его, чтобы получить строки вроде «что-то вроде этого» или «это что-то». Мне интересно, как получить строку с подчеркиванием с помощью функции CONTAINS. - person Kate; 13.01.2010
comment
тогда вы должны добавить еще одну функцию CONTAINS с родительским элементом с подчеркиванием SELECT * FROM TableName WHERE CONTAINS (Name, 'some') OR CONTAINS (Name, '_some') - person IordanTanev; 13.01.2010
comment
Если я использую его, я могу получить строки вроде «something», «_something», но не могу получить «some_thing». Я хочу получить всю строку со словом «some», так что ваш способ не панацея. - person Kate; 13.01.2010
comment
сделайте это с помощью как operatot или просто добавьте OR CONTAINS (Name, 'some_') к предыдущему выражению, которое я предпочитаю использовать как - person IordanTanev; 13.01.2010
comment
Спасибо, я пробую, но CONTAINS (Name, '_some') не соответствует строке this_something, только _something. С одной стороны, CONTAINS работает быстрее, чем оператор Like, с другой - CONTAINS не соответствует строке, которую я хочу, так что вы правы, мне лучше использовать Like. - person Kate; 13.01.2010
comment
Я где-то читал в Интернете, что если столбец, который вы фильтруете с помощью Like, имеет индекс, а фильтр Like имеет% только справа, то индекс работает, и Like работает быстрее. CONTAINS (Name, '_ some') ИЛИ, например, «some%» может быть быстрее, чем «% some%», но вы должны это проверить. - person IordanTanev; 13.01.2010
comment
Спасибо за ответ, но мне нужно выражение "% some%". - person Kate; 13.01.2010

В последний раз, когда я смотрел (правда, SQL Server 2000) CONTAINS не поддерживал сопоставление с подстановочными знаками в начале слов, только в конце. Кроме того, вам может потребоваться проверить ваши файлы шума, чтобы увидеть, игнорируется ли символ «_».

Также см

Как получить хотите ли вы использовать полнотекстовый поиск с подстановочными знаками для работы в SQL Server?

person davek    schedule 13.01.2010

Попробуй это:

SELECT * FROM TableName WHERE CONTAINS(Name,'some')
person codaddict    schedule 13.01.2010