Pregunta

Tuve una consulta FREETEXTTABLE en funcionamiento que buscaba un @searchString. Ahora necesito UNION que con otra consulta simple que intenta analizar @searchString en un INT, y si tiene éxito, filtra la tabla buscando la fila con PK igual al parse @searchString.

Anteriormente, podía unir fácilmente el resultado de FREETEXTTABLE a la tabla en la que estaba buscando, ordenado por el Rango, pero solo SELECCIONAR las columnas de la tabla original en la que se buscó.

Ahora que estoy combinando los resultados únicos entre la consulta de búsqueda de texto y la consulta que busca la fila con la cadena de búsqueda como la clave, ya no tengo acceso al Rango desde la consulta de búsqueda de texto.

¿Cómo puedo mantener el orden por rango de la búsqueda de texto completo, pero ubicar el resultado de la consulta buscando la fila con la clave principal (si tiene un resultado) ANTES de los resultados de la búsqueda de texto completo?

¿Fue útil?

Solución

¿Ha intentado simplemente agregar una constante a su unión que coloca su coincidencia exacta de la PK en la parte superior de la lista? No recuerdo de la parte superior de mi cabeza lo que devuelve la columna RANGO del texto libre (de 0 a 1000, creo), pero algo como esto funcionaría suponiendo que solo haces tu constante más alto que el más alto 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

Otros consejos

Con un montón de ayuda de Scott, esto es lo que tengo 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top