Ordenando resultado FREETEXTTABLE unioned com SELECT padrão pelo Ranking
-
05-07-2019 - |
Pergunta
Eu tive uma consulta FREETEXTTABLE trabalho que procurou um @searchString. Agora eu preciso UNIÃO que com outra consulta simples que tenta analisar o @searchString em um INT, e se for bem sucedido, filtrando a mesa, olhando para a linha com PK igual ao @searchString de análise.
Anteriormente, eu poderia facilmente juntar-se ao resultado FREETEXTTABLE à mesa que estava à procura, a ordem pela Rank, mas apenas selecionar as colunas da tabela original que foi pesquisado.
Agora que estou combinando os resultados únicos entre a consulta de pesquisa de texto ea consulta procurando a linha com a seqüência de pesquisa como a chave, eu já não têm acesso ao Posto da consulta de pesquisa de texto.
Como posso manter a ordem pela classificação da pesquisa de texto completo, mas colocar o resultado da consulta procurando a linha com a chave primária (se tiver um resultado) antes dos resultados de pesquisa de texto completo?
Solução
Você já tentou apenas adicionando uma constante ao seu união que coloca a sua correspondência exata do PK no topo da lista? Não me lembro fora do topo da minha cabeça o que os FREETEXT retornos coluna RANK (0 através de 1000 eu acho), mas algo como isso iria funcionar supondo que você apenas fazer o seu constante superior ao topo da classificação.
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
Outras dicas
Com uma tonelada de ajuda de Scott, este é o que eu tenho que finalmente funciona:
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