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?

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top