طلب UNIONed نتيجة FREETEXTTABLE مع معيار الاختيار عن طريق التدرج
-
05-07-2019 - |
سؤال
وكان لي استعلام FREETEXTTABLE العمل التي بحثت عن وsearchString. أنا الآن بحاجة إلى UNION أنه مع استعلام بسيط آخر يحاول تحليلsearchString إلى INT، وإذا نجحت، وتصفية الجدول من خلال البحث عن الصف مع PK يساويsearchString تحليل.
وفي السابق، وأنا يمكن بسهولة انضمام نتيجة FREETEXTTABLE إلى طاولة أنها كانت تبحث، أمر من رتبة، ولكن فقط حدد أعمدة الجدول الأصلي الذي تم تفتيشه.
والآن أنني الجمع بين نتائج فريدة من نوعها بين استعلام البحث عن النص والاستعلام تبحث عن خلاف مع سلسلة البحث كمفتاح، وأنا لم يعد لديك الوصول إلى رتبة من الاستعلام البحث عن النص.
وكيف يمكنني الحفاظ على ترتيب حسب الرتبة من البحث عن النص الكامل، ولكن وضع نتيجة الاستعلام تبحث عن خلاف مع المفتاح الأساسي (إذا كان لديه نتيجة لذلك) BEFORE نتائج البحث عن النص الكامل؟
المحلول
ولقد حاولت فقط إضافة ثابت إلى نقابتكم أن يضع تطابق تام الخاص بك من PK على رأس القائمة؟ أنا لا أتذكر من على قمة رأسي ما يعود العمود FREETEXT RANK (0-1000 على ما أظن)، ولكن شيئا من هذا القبيل يعمل على افتراض أن لمجرد تقديم أعلى الخاص بك ثابت من أعلى رتبة.
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
نصائح أخرى
ومع من نصف طن من المساعدة من سكوت، وهذا هو ما قلته أن يعمل أخيرا:
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