Порядок FREETEXTTABLE результат UNIONed со стандартным SELECT по рангу
У меня был рабочий запрос FREETEXTTABLE, который искал @searchString. Теперь мне нужно ОБЪЕДИНИТЬ это с помощью другого простого запроса, который пытается проанализировать @searchString в INT, и, если это удастся, отфильтровать таблицу путем поиска строки с PK, равным parse @searchString.
Ранее я мог легко присоединить результат FREETEXTTABLE к таблице, которую он искал, упорядочить по рангу, но только ВЫБРАТЬ столбцы исходной таблицы, в которой был произведен поиск.
Теперь, когда я объединяю уникальные результаты между запросом текстового поиска и запросом на поиск строки со строкой поиска в качестве ключа, у меня больше нет доступа к рейтингу из запроса текстового поиска.
Как я могу сохранить порядок по рангу полнотекстового поиска, но разместить результат запроса, ища строку с первичным ключом (если он имеет результат) ПЕРЕД результатами полнотекстового поиска?
2 ответа
Вы пробовали просто добавить константу в ваш союз, которая ставит ваше точное совпадение с PK в верхнюю часть списка? Я не могу вспомнить, что возвращает столбец RANK в свободном тексте (я думаю, от 0 до 1000), но что-то вроде этого сработало бы, если бы вы просто сделали свою константу выше вершины ранга.
DECLARE @id int
IF ISNUMERIC(@myStringId) = 1
SET @id = CAST(@myStringId AS int)
ELSE
SET @id = 0
WITH MyFreetextCte as (SELECT [Rank],
[Key]
FROM FREETEXTTABLE(...)
UNION
SELECT 1001,
(SELECT MyBaseTable.PK FROM MyBaseTable WHERE PK = @id))
SELECT *
FROM MyFreetextCte JOIN MyBaseTable ON MyFreetextCte.[Key] = MyBaseTable.PK
ORDER BY MyFreetextCte.Rank DESC
С огромной помощью от Скотта вот что у меня наконец получилось:
CREATE PROCEDURE dbo.testProcedure
(
@searchPhrase nvarchar(500)
)
AS
DECLARE @id int
SET @id = 0;
BEGIN TRY
SET @id = CAST(@id AS int)
END TRY
BEGIN CATCH
END CATCH;
-- at this point, @id will be the primary key if it is only digits
-- otherwise it will default to zero (which is out of range of my identity PK)
WITH ftsTable AS (
SELECT RANK, [KEY] FROM FREETEXTTABLE(sourceTable, *, @searchPhrase)
UNION
SELECT 1001, (SELECT sourceTableID FROM sourceTable WHERE sourceTableID = @id)
)
SELECT sourceTable.*
FROM ftsTable JOIN sourceTable ON ftsTable.[KEY] = sourceTable.sourceTableID
ORDER BY ftsTable.RANK DESC