Можно ли использовать ContainsTable для получения результатов для более чем одного столбца? - PullRequest
2 голосов
/ 11 февраля 2010

Рассмотрим следующую таблицу:

Люди

  • FirstName nvarchar (50)
  • LastName nvarchar (50)

Предположим на данный момент, что в этой таблице есть полнотекстовый индекс для обоих столбцов.

Давайте предположим, что я хотел найти всех людей по имени "Джон Смит" в этой таблице. Следующий запрос кажется вполне рациональным способом сделать это:

SELECT * from People p
INNER JOIN CONTAINSTABLE(People,*,'"John*" AND "Smith*"')

К сожалению, это не даст никаких результатов, если предположить, что в таблице People нет записей, в которых есть столбцы "John" и "Smith" в столбцах FirstName или LastName. Он не будет совпадать с записью «Джон» в столбце «Имя» и «Смит» в столбце «Имя» или наоборот.

У меня такой вопрос: как достичь того, что я пытаюсь сделать выше? Пожалуйста, учтите, что приведенный выше пример упрощен. Реальная таблица, с которой я работаю, состоит из десяти столбцов, и входные данные, которые я получаю, представляют собой одну строку, которая разбита на основе стандартных средств разбиения по словам (пробел, тире и т. Д.)

Ответы [ 2 ]

0 голосов
/ 07 мая 2010

Вот что я в итоге сделал:

Пример, который я привел выше, мог быть немного упрощен. В реальном приложении полнотекстовый индекс фактически находится в представлении, представляющем объединение двух таблиц. Одним из преимуществ этого является то, что схема представления может быть независимой от таблиц, из которых оно построено.

Чтобы использовать мой (упрощенный) пример, приведенный выше, у меня есть таблица, которая выглядит следующим образом:

Люди

  • FirstName nvarchar (50)
  • Фамилия nvarchar (50)

Представление, из которого фактически построен индекс, выглядело так:

PeopleView

  • FirstName nvarchar (50)
  • Фамилия nvarchar (50)

Чтобы обойти проблему, я изменил схему представления так, чтобы теперь был один столбец (плюс ключ), который содержит содержимое всей таблицы (таблиц), представленных представлением:

PeopleView

  • Имя (Имя + Фамилия +)

Полнотекстовый каталог, конечно, пришлось перестраивать с учетом новой схемы представления, но все изменения были сделаны на уровне базы данных, что не означало никаких изменений в коде приложения. Мне пришлось внести несколько корректировок в представление для обработки столбцов, которые могут иметь нулевые значения, поскольку NULL объединяется с любым значением = NULL.

0 голосов
/ 12 марта 2010
...