Один из моих клиентов подключен к сопоставлению подстрок с несколькими столбцами.
Я понимаю, что Содержит и FreeText поиск слов (и, по крайней мере, в случае Содержит, префиксы слов). Однако, исходя из моего понимания этой книги MSDN, ни эти, ни их варианты не способны искать подстроки.
Я использовал LIKE довольно широко (выберите * из A, где A.B Как '% substr%')
Пример таблицы A:
ID | Col1 | Col2 | Col3 |
-------------------------------------
1 | oklahoma | colorado | Utah |
2 | arkansas | colorado | oklahoma |
3 | florida | michigan | florida |
-------------------------------------
Следующий код даст нам строку 1 и строку 2:
select * from A where Col1 like '%klah%' or Col2 like '%klah%' or Col3 like '%klah%'
Это довольно уродливо, возможно, медленно, и мне просто не очень нравится. Возможно, потому что у реализаций, с которыми я имею дело, есть более 10 столбцов, которые нужно искать.
Следующее может быть небольшим улучшением с точки зрения читабельности кода, но с точки зрения производительности мы все еще находимся в том же парке событий.
select * from A where (Col1 + ' ' + Col2 + ' ' + Col3) like '%klah%'
Я думал о простом добавлении триггеров вставки, обновления и удаления, которые просто добавляют объединенную версию вышеприведенных столбцов в отдельную таблицу, которая затеняет эту таблицу.
Пример Shadow_Table:
ID | searchtext |
---------------------------------
1 | oklahoma colorado Utah |
2 | arkansas colorado oklahoma |
3 | florida michigan florida |
---------------------------------
Это позволит нам выполнить следующий запрос для поиска '% klah%'
select * from Shadow_Table where searchtext like '%klah%'
Мне действительно не нравится вспоминать, что эта теневая таблица существует и что я должна использовать ее, когда выполняю сопоставление подстрок с несколькими столбцами, но, вероятно, она дает довольно быстрое чтение за счет записи и хранения пространство.
Мои интуитивные ощущения говорят мне, что в SQL Server 2008 есть встроенное решение. Однако я, похоже, не могу найти ничего, кроме исследовательских работ по этому вопросу.
Любая помощь будет оценена.