Как избежать двойных кавычек внутри полнотекстовой функции SQL «содержит»?

Как вы избегаете символа двойной кавычки внутри функции «содержит» MS SQL?

SELECT decision
FROM table 
WHERE CONTAINS(decision, '34" AND wide')

Обычно contains() ожидает, что точная фраза будет заключена в двойные кавычки, но я хочу найти фактический символ двойной кавычки. Я пытался избежать его с помощью \, ` и даже другой двойной кавычки, но ничего из этого не сработало.

P.S. Я понимаю, что простой пример, подобный этому, также может быть выполнен с помощью оператора LIKE, но мне нужно использовать функцию полнотекстового поиска. Запрос, который я предоставил здесь, был упрощен по сравнению с моим фактическим запросом для примера.


person Richard Davies    schedule 21.05.2010    source источник
comment
Связанный с этим вопрос, который уже видел OP: > stackoverflow.com/questions/387198/   -  person mechanical_meat    schedule 22.05.2010


Ответы (2)


Из документации:

Пунктуация игнорируется. Таким образом, CONTAINS(testing, "computer failure") соответствует строке со значением "Где мой компьютер? Если его не найти, это дорого обойдётся".

Поскольку FULLTEXT даже не индексирует знаки препинания, вам нужно отфильтровать результаты с помощью LIKE:

SELECT  decision
FROM    table 
WHERE   CONTAINS(decision, '34 AND wide')
        AND decision LIKE '%34"%'

Это позволит сохранить преимущества полного текста.

person Quassnoi    schedule 21.05.2010

Приведенный выше ответ не работает в SQL Server 2008, если ваша строка предназначена для однозначного числа.

Это работает:

SELECT  partdescription
FROM    table  
WHERE   CONTAINS(partdescription, '10') 
        AND decision LIKE '%10"%'

Это не работает:

SELECT  partdescription
FROM    table  
WHERE   CONTAINS(partdescription, '6') 
        AND decision LIKE '%6"%'' 

РЕДАКТИРОВАТЬ: Объяснение того, почему одна цифра не может быть проиндексирована.

Если используется список системных стоп-слов (или шумовых слов), он содержит каждую цифру как слова, которые следует игнорировать. Вы можете изменить содержимое списка стоп-слов или полностью отключить стоп-слова.

 ALTER FULLTEXT INDEX ON dbo.my_ft_table SET STOPLIST = OFF;

После внесения одного из этих изменений затронутый текст должен быть переиндексирован, прежде чем отдельные цифры станут доступными для поиска. После переиндексации действительно можно будет искать «6».

person Jabare    schedule 18.09.2012
comment
Я обновил объяснение, чтобы включить, почему одна цифра будет или не будет проиндексирована. - person RLF; 10.04.2014