Вот функция разделения, которая имеет необязательный параметр разделителя ...
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 разбивает ваши условия запроса на строки в табличной переменной и возвращает их. Затем запросы на выборку объединяются с результирующей таблицей. Запрос отличается тем, что возвращается только 1 экземпляр строки независимо от того, сколько терминов соответствует запросу. Условие соединения можно легко разбить на ряд условий И / ИЛИ, но я думаю, что операции 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)