Commande de résultat FREETEXTTABLE UNIONed avec SELECT standard par rang
-
05-07-2019 - |
Question
J'avais une requête FREETEXTTABLE qui recherchait un @searchString. Il me faut maintenant UNION avec une autre requête simple qui essaie d'analyser @searchString dans un INT et, le cas échéant, filtrant la table en recherchant la ligne avec PK égale à l'analyse @searchString.
Auparavant, je pouvais facilement associer le résultat FREETEXTTABLE à la table dans laquelle il effectuait une recherche, en ordre de classement, mais uniquement en sélectionnant les colonnes de la table d'origine recherchée.
Maintenant que je combine les résultats uniques entre la requête de recherche de texte et la requête de recherche de la ligne avec la chaîne de recherche comme clé, je n'ai plus accès au classement de la requête de recherche de texte.
Comment puis-je conserver l'ordre de classement de la recherche en texte intégral en plaçant le résultat de la requête à la recherche de la ligne avec la clé primaire (si elle a un résultat) AVANT les résultats de la recherche en texte intégral?
La solution
Avez-vous essayé d’ajouter à votre syndicat une constante qui place votre correspondance exacte du PK en haut de la liste? Je ne me souviens pas spontanément de ce que la colonne R & R freetext renvoie (0 à 1 000, je pense), mais quelque chose comme cela fonctionnerait si vous aviez juste fait que votre constante soit plus élevée que le haut du classement.
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
Autres conseils
Avec une tonne d'aide de Scott, voici ce que j'ai qui fonctionne finalement:
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