Хранимая процедура SQL - Поиск массива строк в поле и отображение количества вхождений - PullRequest
0 голосов
/ 30 сентября 2011

В нашем случае мы ограничены SQL Server 2000.

Допустим, у нас есть таблица "Статьи" с полем "ArticleText". Как мы ищем строку, состоящую из множества слов, и возвращаем количество найденных вхождений.

Пример строки поиска: Джон - хороший мальчик (поэтому в нем 5 слов)

ID  ArticleText                         Result
1   John is going to learn              2
2   John is doing his homework nice-ly  3
3   John is a nice boy                  5

До сих пор я нашел функцию разделения для SQL Server 2000, чтобы разделить строку поиска. Сейчас я пытаюсь перебрать записи и отобразить количество найденных слов в одном поле, но я застрял. Любая помощь?

Ответы [ 3 ]

1 голос
/ 05 октября 2011

Решение SQL Server 2000

Новая идея. Попробуйте сначала разбить строку поиска на 1 временную таблицу. Затем присоединение к статьям с использованием групповых символов.

DECLARE @Search nvarchar(200); 
SET @Search = 'John is a nice boy'; 
IF NOT OBJECT_ID('tempdb..#S') IS NULL
DROP TABLE #S; 

SELECT * 
INTO #S 
FROM dbo.Split(@Search, ' '); 

SELECT a.ID, a.ArticleText, COUNT(*) as [Result] 
FROM #S as s 
JOIN Articles as a on a.ArticleText like s.Data + ' %' 
OR a.ArticleText like '% ' + s.Data + '%' 
GROUP BY a.ID, a.ArticleText

Я проверял это на SQL Server 2008 R2 с режимом совместимости 2000.

2 условия соединения гарантируют, что оно соответствует первому слову или любому началу слов (чтобы получить «nice-»). Вы должны настроить это в соответствии со своими требованиями и рассмотреть возможность замены функций дефиса и других знаков препинания.

1 голос
/ 02 октября 2011

Решение SQL Server 2008

Вы используете перекрестное применение, которое передает каждое значение из таблицы в функцию и объединяет результат.

SELECT a.ID, a.ArticleText, COUNT(*) as [Result]
FROM Articles as a
CROSS APPLY dbo.Split(a.ArticleText,' ') as S
WHERE S.Data IN ('John','is','a','nice','boy')
GROUP BY a.ID, a.ArticleText

Интересно, если вы просто передаете текст в виде одной строки, что более вероятно при замене текста примера.Вы также можете использовать функцию Split, например, «Джон - хороший мальчик» из параметра процедуры или локальной переменной.

SELECT a.ID, a.ArticleText, COUNT(*) as [Result]
FROM Articles as a
CROSS APPLY dbo.Split(a.ArticleText,' ') as S
WHERE S.Data IN (SELECT Data FROM dbo.Split(@Search,' '))
GROUP BY a.ID, a.ArticleText
0 голосов
/ 05 октября 2011

Rusell, Большое спасибо.

Теперь у меня возникла проблема с #S "В базе данных уже есть объект с именем" #S ".

, а также с:

SELECT * INTO @tblWords FROM dbo.Split(@Search, ' '); 

Но не берите в голову, я исправил это, поэтому я посылаю код, который работает в SQL 2000.

declare @Search varchar(100)
set @Search = 'John is a nice boy'

DECLARE @tblWords TABLE(IDArray int, ArrayValue VARCHAR(500))
INSERT INTO @tblWords (IDArray, ArrayValue) SELECT * FROM [dbo].[Split] (@Search, ' ')

SELECT IDArticle, ArticleText, COUNT(*) as [Result] FROM @tblWords
    JOIN Articles on ArticleText like ArrayValue + ' %' 
    OR ArticleText like '% ' + ArrayValue + '%' 
        GROUP BY IDArticle, ArticleText
        Order by Result desc

Для тех, ктохочу попробовать это, вот код таблицы:

CREATE TABLE [Articles] (
    [IDArticle] [int] IDENTITY (1, 1) NOT NULL ,
    [ArticleText] [varchar] (500)

Еще раз спасибо, Rusell, я должен тебе кофе.

...