Domanda

Ho avuto una query FREETEXTTABLE funzionante che ha cercato @searchString. Ora ho bisogno di UNION che con un'altra semplice query che tenta di analizzare @searchString in un INT e, se riesce, filtrare la tabella cercando la riga con PK uguale all'analisi @searchString.

In precedenza, potevo facilmente UNIRE il risultato FREETEXTTABLE alla tabella che stava cercando, ordinare per Rango, ma SELEZIONARE solo le colonne della tabella originale che era stata cercata.

Ora che sto combinando i risultati univoci tra la query di ricerca di testo e la query che cerca la riga con la stringa di ricerca come chiave, non ho più accesso al grado dalla query di ricerca di testo.

Come posso mantenere l'ordinamento per classifica della ricerca full-text, ma posizionare il risultato della query cercando la riga con la chiave primaria (se ha un risultato) PRIMA dei risultati della ricerca full-text?

È stato utile?

Soluzione

Hai provato ad aggiungere una costante al tuo sindacato che mette la tua corrispondenza esatta del PK in cima alla lista? Non ricordo dalla parte superiore della mia testa ciò che la colonna RANK di Freetext restituisce (0 su 1000 penso), ma qualcosa del genere funzionerebbe supponendo che tu renda la tua costante più alta della cima del rango.

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

Altri suggerimenti

Con un sacco di aiuto da Scott, questo è quello che ho che finalmente funziona:

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top