這裏是一個分裂的功能,有一個分隔符的可選參數...
CREATE FUNCTION [dbo].[fnSplit](@List VARCHAR(4000), @Delimiter CHAR(1) = ',')
RETURNS @Result TABLE (item VARCHAR(100))
BEGIN
DECLARE @Item VARCHAR(100)
WHILE CHARINDEX(@Delimiter,@List,0) <> 0
BEGIN
SELECT @Item = SUBSTRING(@List,1,CHARINDEX(@Delimiter,@List,0)-1)
, @List = SUBSTRING(@List,CHARINDEX(@Delimiter,@List,0)+1,LEN(@List))
IF LEN(@Item) > 0
INSERT INTO @Result
SELECT @Item
END
IF LEN(@List) > 0
INSERT INTO @Result
SELECT @List
RETURN
END
GO
然後你的查詢可以是這個樣子......
SELECT DISTINCT
'restaurants' AS [source]
, r.ID AS [ID] --Assuming ID is your primary key column
, r.name + '(' + r.city + ', ' + r.state + ')' AS [Description]
FROM restaurants AS [r]
JOIN [dbo].[fnSplit](@Query,' ') AS [terms]
ON
ISNULL(r.name,'')
+','+ISNULL(r.city,'')
+','+ISNULL(r.postcode,'') LIKE '%'+terms.item+'%'
UNION SELECT DISTINCT
'cuisine' AS [source]
, r.ID AS [ID] --Assuming ID is your primary key column
, r.name AS [Description]
FROM cuisine AS [r]
JOIN [dbo].[fnSplit](@Query,' ') AS [terms]
ON
ISNULL(r.name,'') LIKE '%'+terms.item+'%'
的fnSplit功能將查詢條件分解爲表變量中的行並將其返回。選擇查詢然後加入到結果表中。查詢是不同的,因此無論查詢中有多少條件匹配,只返回一行的一個實例。連接條件可以很容易地分解爲一系列的AND/OR條件,但我認爲LIKE操作比串聯更昂貴,所以我只是連接列。
UPDATE
因爲全文索引啓用以下簡化查詢可以使用。
DECLARE @Phrase VARCHAR(4000)
SELECT @Phrase = item + '" OR "' FROM [dbo].[fnSplit](@Query,' ')
SET @Phrase = SUBSTRING(@Phrase,0,LEN(@Phrase)-6)
SELECT DISTINCT
'restaurants' AS [source]
, r.ID AS [ID] --Assuming ID is your primary key column
, r.name + '(' + r.city + ', ' + r.state + ')' AS [Description]
FROM restaurants AS [r]
WHERE
CONTAINS(r.name,@Phrase)
OR CONTAINS(r.city,@Phrase)
OR CONTAINS(r.postcode,@Phrase)
UNION SELECT DISTINCT
'cuisine' AS [source]
, r.ID AS [ID] --Assuming ID is your primary key column
, r.name AS [Description]
FROM cuisine AS [r]
WHERE CONTAINS(r.name,@Phrase)
想要「AND」或「OR」嗎?您聲明「AND」,但這意味着搜索詞必須位於餐廳,美食,城市和郵編區域。因此,對於所有在「21201」中爲「21201」命名的「21201」餐館,在晚餐時間服務「21201」的MD(郵政編碼「21201」),這將適用於...... – GalacticCowboy 2009-07-08 22:56:37
您並不需要郵編和全文的全文普通的舊索引將起作用。你也在使用全文來處理它沒有設計的東西,它被設計爲索引大塊文本,而不是2,3個字。 – 2009-07-08 22:59:56
我想先檢查一下這個詞是否在餐廳名稱或美食中(例如,餐館可能被稱爲最佳中文),如果不匹配,我想檢查該單詞是否在城市中,如果仍然沒有匹配,我想檢查如果是郵政編碼。 這樣就可以在用戶將文字輸入到文本框中時對結果進行過濾。 – ddd 2009-07-08 23:00:01