Базовый полнотекстовый поиск SQL - PullRequest
0 голосов
/ 24 сентября 2011

Я мало работал с TSQL или функцией полнотекстового поиска SQL Server, так что терпите меня.

У меня есть столбец таблицы nvarchar (Col), как это:

       Col  ... more columns
Row 1: '1'
Row 2: '1|2'
Row 3: '2|40'

Я хочу сделать поиск, чтобы соответствовать аналогичным пользователям. Поэтому, если у меня есть пользователь, у которого значение Col равно 1, я ожидаю, что поиск вернет первые две строки. Если бы у меня был пользователь со значением Col в '1 | 2', я бы ожидал, что сначала будет возвращена строка 2, а затем строка 1. Если я попытаюсь сопоставить пользователей со значением Col в '4', я не получу никаких результатов. , Я подумал о том, чтобы сделать «содержит», разделив значение, которое я использую для запроса, но это не сработало, поскольку «2 | 40» содержит 4 ...

Я просмотрел документацию по использованию ключевого слова 'FREETEXT', но не думаю, что это сработало бы для меня, поскольку мне по сути нужно разбить значения Col на слова, используя '|' как перерыв.

Спасибо, John

Ответы [ 2 ]

1 голос
/ 24 сентября 2011

Вы не должны хранить значения типа «1 | 2» в поле для хранения 2 значений. Если у вас есть максимум 2 значения, вы должны использовать 2 поля для их хранения. Если у вас может быть 0-много значений, вы должны сохранить их в новой таблице с внешним ключом, указывающим на первичный ключ вашей таблицы.

Если в вашей таблице только 2 значения. Вы можете найти ваши данные так:

DECLARE @s VARCHAR(3) = '1'

SELECT * 
FROM <table> 
WHERE @s IN( 
    PARSENAME(REPLACE(col, '|', '.'), 1),  
    PARSENAME(REPLACE(col, '|', '.'), 2) 
    --,PARSENAME(REPLACE(col, '|', '.'), 3) -- if col can contain 3 
    --,PARSENAME(REPLACE(col, '|', '.'), 4) -- or 4 values this can be used
  )

Parsename может обрабатывать до 4 значений. Если 'col' может содержать более 4 значений, используйте это

DECLARE @s VARCHAR(3) = '1'

SELECT * 
FROM <table> 
WHERE '|' + col + '|' like '%|' + @s + '|%'
0 голосов
/ 24 сентября 2011

Нужно смешать это с делом, когда нет | но это возвращает левую и правую стороны

      select left('2|10', CHARINDEX('|', '2|10') - 1)
      select right('2|10', CHARINDEX('|', '2|10'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...